From 32cf3e24e2faf7d4882b7c80148829c35470f8c4 Mon Sep 17 00:00:00 2001 From: akwizgran <michael@briarproject.org> Date: Sat, 13 Apr 2013 14:06:26 +0100 Subject: [PATCH] Made reference manager thread safe. --- .../src/net/sf/briar/android/ReferenceManagerImpl.java | 10 +++++----- .../briar/android/invitation/AddContactActivity.java | 4 ---- .../src/net/sf/briar/api/android/ReferenceManager.java | 3 --- 3 files changed, 5 insertions(+), 12 deletions(-) diff --git a/briar-android/src/net/sf/briar/android/ReferenceManagerImpl.java b/briar-android/src/net/sf/briar/android/ReferenceManagerImpl.java index 3da1ce3be8..48788b7819 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 7b5ec9f72e..6f59e7413a 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 21588adb05..61445e9351 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 { -- GitLab