Return early when you #remove a set of listeners.
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/preferences/ListenerRegistry.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/preferences/ListenerRegistry.java
index 6fb769f..62d77e5 100644
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/preferences/ListenerRegistry.java
+++ b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/preferences/ListenerRegistry.java
@@ -57,8 +57,10 @@
 		void put(String key, ListenerList value) {
 			if (key == null)
 				throw new NullPointerException();
-			if (value == null)
+			if (value == null) {
 				remove(key);
+				return;
+			}
 			// replace if exists, keeping track of an empty position
 			int emptyIndex = -1;
 			for (int i = 0; i < keys.length; i++) {
@@ -146,5 +148,12 @@
 		if (list.isEmpty())
 			registry.remove(path);
 	}
+	
+	/**
+	 * Remove all of the listeners registered under the given path.
+	 */
+	public synchronized void clear(String path) {
+		registry.remove(path);
+	}
 
 }