From 26c7f1bd80dc9f089689fa10335cf2c2a2fd39a8 Mon Sep 17 00:00:00 2001
From: akwizgran <akwizgran@users.sourceforge.net>
Date: Mon, 28 Nov 2011 15:12:13 +0000
Subject: [PATCH] Use CopyOnWriteArrayList for listener lists.

---
 .../sf/briar/db/DatabaseComponentImpl.java    | 24 +++++--------------
 components/net/sf/briar/i18n/I18nImpl.java    | 19 ++++++---------
 2 files changed, 13 insertions(+), 30 deletions(-)

diff --git a/components/net/sf/briar/db/DatabaseComponentImpl.java b/components/net/sf/briar/db/DatabaseComponentImpl.java
index 34f177ec8b..90e9a5e659 100644
--- a/components/net/sf/briar/db/DatabaseComponentImpl.java
+++ b/components/net/sf/briar/db/DatabaseComponentImpl.java
@@ -13,8 +13,8 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Iterator;
-import java.util.List;
 import java.util.Map;
+import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -105,8 +105,8 @@ DatabaseCleaner.Callback {
 	private final DatabaseCleaner cleaner;
 	private final ShutdownManager shutdown;
 
-	private final List<DatabaseListener> listeners =
-		new ArrayList<DatabaseListener>(); // Locking: self
+	private final Collection<DatabaseListener> listeners =
+		new CopyOnWriteArrayList<DatabaseListener>();
 
 	private final Object spaceLock = new Object();
 	private long bytesStoredSinceLastCheck = 0L; // Locking: spaceLock
@@ -161,15 +161,11 @@ DatabaseCleaner.Callback {
 	}
 
 	public void addListener(DatabaseListener d) {
-		synchronized(listeners) {
-			listeners.add(d);
-		}
+		listeners.add(d);
 	}
 
 	public void removeListener(DatabaseListener d) {
-		synchronized(listeners) {
-			listeners.remove(d);
-		}
+		listeners.remove(d);
 	}
 
 	public ContactId addContact(byte[] inSecret, byte[] outSecret)
@@ -198,15 +194,7 @@ DatabaseCleaner.Callback {
 
 	/** Notifies all listeners of a database event. */
 	private void callListeners(DatabaseEvent e) {
-		List<DatabaseListener> copy;
-		synchronized(listeners) {
-			if(listeners.isEmpty()) return;
-			copy = new ArrayList<DatabaseListener>(listeners);
-		}
-		// Shuffle the listeners so we don't always send new messages
-		// to contacts in the same order
-		Collections.shuffle(copy);
-		for(DatabaseListener d : copy) d.eventOccurred(e);
+		for(DatabaseListener d : listeners) d.eventOccurred(e);
 	}
 
 	public void addLocalGroupMessage(Message m) throws DbException {
diff --git a/components/net/sf/briar/i18n/I18nImpl.java b/components/net/sf/briar/i18n/I18nImpl.java
index 6bda4a2a13..bd1bbf5fff 100644
--- a/components/net/sf/briar/i18n/I18nImpl.java
+++ b/components/net/sf/briar/i18n/I18nImpl.java
@@ -6,12 +6,12 @@ import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.PrintStream;
-import java.util.HashSet;
+import java.util.Collection;
 import java.util.Locale;
 import java.util.MissingResourceException;
 import java.util.ResourceBundle;
 import java.util.Scanner;
-import java.util.Set;
+import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -77,7 +77,8 @@ public class I18nImpl implements I18n {
 
 	private final Object bundleLock = new Object();
 	private final ClassLoader loader = I18n.class.getClassLoader();
-	private final Set<Listener> listeners = new HashSet<Listener>();
+	private final Collection<Listener> listeners =
+		new CopyOnWriteArrayList<Listener>();
 	private final FontManager fontManager;
 
 	private volatile Locale locale = Locale.getDefault();
@@ -123,9 +124,7 @@ public class I18nImpl implements I18n {
 			this.locale = locale;
 			Locale.setDefault(locale);
 			bundle = null;
-			synchronized(listeners) {
-				for(Listener l : listeners) l.localeChanged(uiFont);
-			}
+			for(Listener l : listeners) l.localeChanged(uiFont);
 		}
 	}
 
@@ -157,14 +156,10 @@ public class I18nImpl implements I18n {
 
 	public void addListener(Listener l) {
 		l.localeChanged(fontManager.getUiFont());
-		synchronized(listeners) {
-			listeners.add(l);
-		}
+		listeners.add(l);
 	}
 
 	public void removeListener(Listener l) {
-		synchronized(listeners) {
-			listeners.remove(l);
-		}
+		listeners.remove(l);
 	}
 }
-- 
GitLab