# HG changeset patch # User Vladimir Kvashin # Date 1445274722 -10800 # Branch release81 # Node ID c36e8d0900ecbe104ab3edbb8c7f69cd24cb17f5 # Parent fd47b1e855d5938e39c5d3f5bf84f37a043df862 fixed #255997 - [mixeddev] ConcurrentModificationException in NativeDebuggerManager.notifyAttached diff -r fd47b1e855d5 -r c36e8d0900ec cnd.debugger.common2/src/org/netbeans/modules/cnd/debugger/common2/debugger/NativeDebuggerManager.java --- a/cnd.debugger.common2/src/org/netbeans/modules/cnd/debugger/common2/debugger/NativeDebuggerManager.java Fri Oct 09 11:57:05 2015 +0200 +++ b/cnd.debugger.common2/src/org/netbeans/modules/cnd/debugger/common2/debugger/NativeDebuggerManager.java Mon Oct 19 20:12:02 2015 +0300 @@ -2275,20 +2275,28 @@ private final HashSet debuggerStateListeners = new HashSet(); - public synchronized void addDebuggerStateListener(DebuggerStateListener listener) { - if (!debuggerStateListeners.contains(listener)) { - debuggerStateListeners.add(listener); + public void addDebuggerStateListener(DebuggerStateListener listener) { + synchronized (debuggerStateListeners) { + if (!debuggerStateListeners.contains(listener)) { + debuggerStateListeners.add(listener); + } } } - public synchronized void removeDebuggerStateListener(DebuggerStateListener listener) { - if (debuggerStateListeners.contains(listener)) { - debuggerStateListeners.remove(listener); + public void removeDebuggerStateListener(DebuggerStateListener listener) { + synchronized (debuggerStateListeners) { + if (debuggerStateListeners.contains(listener)) { + debuggerStateListeners.remove(listener); + } } } - public synchronized void notifyAttached(NativeDebugger debugger, long pid) { - for (DebuggerStateListener stateListener : debuggerStateListeners) { + public void notifyAttached(NativeDebugger debugger, long pid) { + List listenersCopy; + synchronized(debuggerStateListeners) { + listenersCopy = new ArrayList(debuggerStateListeners); + } + for (DebuggerStateListener stateListener : listenersCopy) { stateListener.notifyAttached(debugger, pid); } } diff -r fd47b1e855d5 -r c36e8d0900ec cnd.mixeddev/src/org/netbeans/modules/cnd/mixeddev/debugger/CndSessionChanger.java --- a/cnd.mixeddev/src/org/netbeans/modules/cnd/mixeddev/debugger/CndSessionChanger.java Fri Oct 09 11:57:05 2015 +0200 +++ b/cnd.mixeddev/src/org/netbeans/modules/cnd/mixeddev/debugger/CndSessionChanger.java Mon Oct 19 20:12:02 2015 +0300 @@ -99,21 +99,25 @@ target.setHostName("localhost"); // NOI18N final CountDownLatch latch = new CountDownLatch(1); - NativeDebuggerManager.get().addDebuggerStateListener(new NativeDebuggerManager.DebuggerStateListener() { + final NativeDebuggerManager.DebuggerStateListener listener = new NativeDebuggerManager.DebuggerStateListener() { @Override public void notifyAttached(NativeDebugger debugger, long pid) { if (pid == longPid) { + // we now remove in finally block - should we still remove it here? NativeDebuggerManager.get().removeDebuggerStateListener(this); debugger.stepTo(funcName); latch.countDown(); } } - }); + }; + NativeDebuggerManager.get().addDebuggerStateListener(listener); NativeDebuggerManager.get().attach(target); try { latch.await(100, TimeUnit.SECONDS); } catch (InterruptedException ex) { Exceptions.printStackTrace(ex); + } finally { + NativeDebuggerManager.get().removeDebuggerStateListener(listener); } NativeDebugger currentDebugger = NativeDebuggerManager.get().currentDebugger(); if (currentDebugger != null) {