1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

First attempt to win Race condition causing deadlock.

This commit is contained in:
Alain Magloire 2004-05-03 20:27:52 +00:00
parent 0eef7aec8a
commit 83de8b24d2

View file

@ -10,9 +10,11 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
import java.util.List;
import java.util.Map; import java.util.Map;
import org.eclipse.cdt.core.BinaryParserConfig; import org.eclipse.cdt.core.BinaryParserConfig;
@ -80,7 +82,7 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
* Queue of deltas created explicily by the C Model that * Queue of deltas created explicily by the C Model that
* have yet to be fired. * have yet to be fired.
*/ */
ArrayList fCModelDeltas = new ArrayList(); List fCModelDeltas = Collections.synchronizedList(new ArrayList());
/** /**
* Queue of reconcile deltas on working copies that have yet to be fired. * Queue of reconcile deltas on working copies that have yet to be fired.
@ -96,7 +98,7 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
/** /**
* Collection of listeners for C element deltas * Collection of listeners for C element deltas
*/ */
protected ArrayList fElementChangedListeners = new ArrayList(); protected List fElementChangedListeners = Collections.synchronizedList(new ArrayList());
/** /**
* A map from ITranslationUnit to IWorkingCopy of the shared working copies. * A map from ITranslationUnit to IWorkingCopy of the shared working copies.
@ -622,21 +624,25 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
/** /**
* addElementChangedListener method comment. * addElementChangedListener method comment.
*/ */
public synchronized void addElementChangedListener(IElementChangedListener listener) { public void addElementChangedListener(IElementChangedListener listener) {
if (fElementChangedListeners.indexOf(listener) < 0) { synchronized(fElementChangedListeners) {
if (!fElementChangedListeners.contains(listener)) {
fElementChangedListeners.add(listener); fElementChangedListeners.add(listener);
} }
} }
}
/** /**
* removeElementChangedListener method comment. * removeElementChangedListener method comment.
*/ */
public synchronized void removeElementChangedListener(IElementChangedListener listener) { public void removeElementChangedListener(IElementChangedListener listener) {
synchronized(fElementChangedListeners) {
int i = fElementChangedListeners.indexOf(listener); int i = fElementChangedListeners.indexOf(listener);
if (i != -1) { if (i != -1) {
fElementChangedListeners.remove(i); fElementChangedListeners.remove(i);
} }
} }
}
/** /**
* Registers the given delta with this manager. This API is to be * Registers the given delta with this manager. This API is to be
@ -742,16 +748,21 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
if (fFire) { if (fFire) {
ICElementDelta deltaToNotify; ICElementDelta deltaToNotify;
if (customDeltas == null) { if (customDeltas == null) {
deltaToNotify = this.mergeDeltas(this.fCModelDeltas); deltaToNotify = mergeDeltas(this.fCModelDeltas);
} else { } else {
deltaToNotify = customDeltas; deltaToNotify = customDeltas;
} }
IElementChangedListener[] listeners;
int listenerCount;
int [] listenerMask;
// Notification // Notification
IElementChangedListener[] listeners = new IElementChangedListener[fElementChangedListeners.size()]; synchronized(fElementChangedListeners) {
listeners = new IElementChangedListener[fElementChangedListeners.size()];
fElementChangedListeners.toArray(listeners); fElementChangedListeners.toArray(listeners);
int listenerCount = listeners.length; listenerCount = listeners.length;
int [] listenerMask = null; listenerMask = null;
}
switch (eventType) { switch (eventType) {
case DEFAULT_CHANGE_EVENT: case DEFAULT_CHANGE_EVENT:
@ -850,6 +861,7 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
private ICElementDelta mergeDeltas(Collection deltas) { private ICElementDelta mergeDeltas(Collection deltas) {
synchronized(deltas) {
if (deltas.size() == 0) if (deltas.size() == 0)
return null; return null;
if (deltas.size() == 1) if (deltas.size() == 1)
@ -877,14 +889,12 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
} }
} }
if (insertedTree) { if (insertedTree) {
//fCModelDeltas = new ArrayList(1);
//fCModelDeltas.add(rootDelta);
return rootDelta; return rootDelta;
} else { } else {
//fCModelDeltas = new ArrayList(0);
return null; return null;
} }
} }
}
/** /**
* Runs a C Model Operation * Runs a C Model Operation