diff --git a/briar-android/src/net/sf/briar/android/ReferenceManagerImpl.java b/briar-android/src/net/sf/briar/android/ReferenceManagerImpl.java index 3da1ce3be..48788b781 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, Map> outerMap = new HashMap, Map>(); - private long nextHandle = 0; + private long nextHandle = 0; // Locking: this - public T getReference(long handle, Class c) { + public synchronized T getReference(long handle, Class c) { Map innerMap = outerMap.get(c); if(innerMap == null) { if(LOG.isLoggable(INFO)) @@ -32,7 +32,7 @@ class ReferenceManagerImpl implements ReferenceManager { return c.cast(o); } - public long putReference(T reference, Class c) { + public synchronized long putReference(T reference, Class c) { Map innerMap = outerMap.get(c); if(innerMap == null) { innerMap = new HashMap(); @@ -47,7 +47,7 @@ class ReferenceManagerImpl implements ReferenceManager { return handle; } - public T removeReference(long handle, Class c) { + public synchronized T removeReference(long handle, Class c) { Map 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 7b5ec9f72..6f59e7413 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 21588adb0..61445e935 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. - *

- * This interface is designed to be accessed from the UI thread, so - * implementations may not be thread-safe. */ public interface ReferenceManager {