diff --git a/briar-android/src/net/sf/briar/android/ReferenceManagerImpl.java b/briar-android/src/net/sf/briar/android/ReferenceManagerImpl.java index 3da1ce3be882826872c7013ae944778e92f79a70..48788b781908c906f100c91c732e849ac781cb0e 100644 --- a/briar-android/src/net/sf/briar/android/ReferenceManagerImpl.java +++ b/briar-android/src/net/sf/briar/android/ReferenceManagerImpl.java @@ -8,18 +8,18 @@ import java.util.logging.Logger; import net.sf.briar.api.android.ReferenceManager; -// This class is not thread-safe. class ReferenceManagerImpl implements ReferenceManager { private static final Logger LOG = Logger.getLogger(ReferenceManagerImpl.class.getName()); + // Locking: this private final Map<Class<?>, Map<Long, Object>> outerMap = new HashMap<Class<?>, Map<Long, Object>>(); - private long nextHandle = 0; + private long nextHandle = 0; // Locking: this - public <T> T getReference(long handle, Class<T> c) { + public synchronized <T> T getReference(long handle, Class<T> c) { Map<Long, Object> innerMap = outerMap.get(c); if(innerMap == null) { if(LOG.isLoggable(INFO)) @@ -32,7 +32,7 @@ class ReferenceManagerImpl implements ReferenceManager { return c.cast(o); } - public <T> long putReference(T reference, Class<T> c) { + public synchronized <T> long putReference(T reference, Class<T> c) { Map<Long, Object> innerMap = outerMap.get(c); if(innerMap == null) { innerMap = new HashMap<Long, Object>(); @@ -47,7 +47,7 @@ class ReferenceManagerImpl implements ReferenceManager { return handle; } - public <T> T removeReference(long handle, Class<T> c) { + public synchronized <T> T removeReference(long handle, Class<T> c) { Map<Long, Object> innerMap = outerMap.get(c); if(innerMap == null) return null; Object o = innerMap.remove(handle); diff --git a/briar-android/src/net/sf/briar/android/invitation/AddContactActivity.java b/briar-android/src/net/sf/briar/android/invitation/AddContactActivity.java index 7b5ec9f72e705cea59cf780b7483ed185364013a..6f59e7413a020bb728e86a5d805356304d5406d5 100644 --- a/briar-android/src/net/sf/briar/android/invitation/AddContactActivity.java +++ b/briar-android/src/net/sf/briar/android/invitation/AddContactActivity.java @@ -360,7 +360,6 @@ implements InvitationListener { } public void connectionFailed() { - // FIXME: Do this on the UI thread referenceManager.removeReference(handle, InvitationTask.class); } @@ -369,17 +368,14 @@ implements InvitationListener { } public void remoteConfirmationFailed() { - // FIXME: Do this on the UI thread referenceManager.removeReference(handle, InvitationTask.class); } public void pseudonymExchangeSucceeded(String remoteName) { - // FIXME: Do this on the UI thread referenceManager.removeReference(handle, InvitationTask.class); } public void pseudonymExchangeFailed() { - // FIXME: Do this on the UI thread referenceManager.removeReference(handle, InvitationTask.class); } } diff --git a/briar-api/src/net/sf/briar/api/android/ReferenceManager.java b/briar-api/src/net/sf/briar/api/android/ReferenceManager.java index 21588adb056c63002a5308adc0bc695b23213a6a..61445e9351a7a7c1f6b4f2a2a6fb54d819c9bc6c 100644 --- a/briar-api/src/net/sf/briar/api/android/ReferenceManager.java +++ b/briar-api/src/net/sf/briar/api/android/ReferenceManager.java @@ -4,9 +4,6 @@ package net.sf.briar.api.android; * Manages mappings between object references and serialisable handles. This * enables references to be passed between Android UI objects that belong to * the same process but can only communicate via serialisation. - * <p> - * This interface is designed to be accessed from the UI thread, so - * implementations may not be thread-safe. */ public interface ReferenceManager {