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