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.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
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
* 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.
@ -96,7 +98,7 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
/**
* 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.
@ -622,21 +624,25 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
/**
* addElementChangedListener method comment.
*/
public synchronized void addElementChangedListener(IElementChangedListener listener) {
if (fElementChangedListeners.indexOf(listener) < 0) {
public void addElementChangedListener(IElementChangedListener listener) {
synchronized(fElementChangedListeners) {
if (!fElementChangedListeners.contains(listener)) {
fElementChangedListeners.add(listener);
}
}
}
/**
* removeElementChangedListener method comment.
*/
public synchronized void removeElementChangedListener(IElementChangedListener listener) {
public void removeElementChangedListener(IElementChangedListener listener) {
synchronized(fElementChangedListeners) {
int i = fElementChangedListeners.indexOf(listener);
if (i != -1) {
fElementChangedListeners.remove(i);
}
}
}
/**
* Registers the given delta with this manager. This API is to be
@ -742,16 +748,21 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
if (fFire) {
ICElementDelta deltaToNotify;
if (customDeltas == null) {
deltaToNotify = this.mergeDeltas(this.fCModelDeltas);
deltaToNotify = mergeDeltas(this.fCModelDeltas);
} else {
deltaToNotify = customDeltas;
}
IElementChangedListener[] listeners;
int listenerCount;
int [] listenerMask;
// Notification
IElementChangedListener[] listeners = new IElementChangedListener[fElementChangedListeners.size()];
synchronized(fElementChangedListeners) {
listeners = new IElementChangedListener[fElementChangedListeners.size()];
fElementChangedListeners.toArray(listeners);
int listenerCount = listeners.length;
int [] listenerMask = null;
listenerCount = listeners.length;
listenerMask = null;
}
switch (eventType) {
case DEFAULT_CHANGE_EVENT:
@ -850,6 +861,7 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
private ICElementDelta mergeDeltas(Collection deltas) {
synchronized(deltas) {
if (deltas.size() == 0)
return null;
if (deltas.size() == 1)
@ -877,14 +889,12 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
}
}
if (insertedTree) {
//fCModelDeltas = new ArrayList(1);
//fCModelDeltas.add(rootDelta);
return rootDelta;
} else {
//fCModelDeltas = new ArrayList(0);
return null;
}
}
}
/**
* Runs a C Model Operation