Skip to content

Commit c56d328

Browse files
Jörg Kubitziloveeclipse
Jörg Kubitz
authored andcommitted
Simplify concurrent AbstractTextSearchResult.fListeners
Avoids synchronization on every use. Slight difference: the pathetic case of adding a listener multiple times would now also result in calling the listener as many times.
1 parent a6ead3d commit c56d328

File tree

1 file changed

+7
-17
lines changed

1 file changed

+7
-17
lines changed

bundles/org.eclipse.search/newsearch/org/eclipse/search/ui/text/AbstractTextSearchResult.java

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,12 @@
1818
import java.util.Collection;
1919
import java.util.Collections;
2020
import java.util.Enumeration;
21-
import java.util.HashSet;
22-
import java.util.Iterator;
2321
import java.util.List;
2422
import java.util.Map.Entry;
2523
import java.util.Set;
2624
import java.util.concurrent.ConcurrentHashMap;
2725
import java.util.concurrent.ConcurrentMap;
26+
import java.util.concurrent.CopyOnWriteArrayList;
2827
import java.util.concurrent.atomic.AtomicInteger;
2928

3029
import org.eclipse.search.ui.ISearchResult;
@@ -53,7 +52,7 @@ public abstract class AbstractTextSearchResult implements ISearchResult {
5352
*/
5453
protected AbstractTextSearchResult() {
5554
fElementsToMatches= new ConcurrentHashMap<>();
56-
fListeners= new ArrayList<>();
55+
fListeners = new CopyOnWriteArrayList<>();
5756
matchCount = new AtomicInteger(0);
5857
fMatchFilters= null; // filtering disabled by default
5958
}
@@ -233,16 +232,12 @@ private boolean didRemoveMatch(Match match) {
233232

234233
@Override
235234
public void addListener(ISearchResultListener l) {
236-
synchronized (fListeners) {
237-
fListeners.add(l);
238-
}
235+
fListeners.add(l);
239236
}
240237

241238
@Override
242239
public void removeListener(ISearchResultListener l) {
243-
synchronized (fListeners) {
244-
fListeners.remove(l);
245-
}
240+
fListeners.remove(l);
246241
}
247242

248243
/**
@@ -254,13 +249,8 @@ public void removeListener(ISearchResultListener l) {
254249
* @see ISearchResultListener
255250
*/
256251
protected void fireChange(SearchResultEvent e) {
257-
HashSet<ISearchResultListener> copiedListeners= new HashSet<>();
258-
synchronized (fListeners) {
259-
copiedListeners.addAll(fListeners);
260-
}
261-
Iterator<ISearchResultListener> listeners= copiedListeners.iterator();
262-
while (listeners.hasNext()) {
263-
listeners.next().searchResultChanged(e);
252+
for (ISearchResultListener listener : fListeners) {
253+
listener.searchResultChanged(e);
264254
}
265255
}
266256

@@ -276,7 +266,7 @@ private void updateFilterStateForAllMatches() {
276266
}
277267
}
278268
}
279-
Match[] allChanges= changed.toArray(new Match[changed.size()]);
269+
Match[] allChanges = changed.toArray(Match[]::new);
280270
fireChange(new FilterUpdateEvent(this, allChanges, getActiveMatchFilters()));
281271
}
282272

0 commit comments

Comments
 (0)