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,19 +624,23 @@ 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) {
fElementChangedListeners.add(listener); if (!fElementChangedListeners.contains(listener)) {
fElementChangedListeners.add(listener);
}
} }
} }
/** /**
* removeElementChangedListener method comment. * removeElementChangedListener method comment.
*/ */
public synchronized void removeElementChangedListener(IElementChangedListener listener) { public void removeElementChangedListener(IElementChangedListener listener) {
int i = fElementChangedListeners.indexOf(listener); synchronized(fElementChangedListeners) {
if (i != -1) { int i = fElementChangedListeners.indexOf(listener);
fElementChangedListeners.remove(i); if (i != -1) {
fElementChangedListeners.remove(i);
}
} }
} }
@ -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) {
fElementChangedListeners.toArray(listeners); listeners = new IElementChangedListener[fElementChangedListeners.size()];
int listenerCount = listeners.length; fElementChangedListeners.toArray(listeners);
int [] listenerMask = null; listenerCount = listeners.length;
listenerMask = null;
}
switch (eventType) { switch (eventType) {
case DEFAULT_CHANGE_EVENT: case DEFAULT_CHANGE_EVENT:
@ -850,39 +861,38 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
private ICElementDelta mergeDeltas(Collection deltas) { private ICElementDelta mergeDeltas(Collection deltas) {
if (deltas.size() == 0) synchronized(deltas) {
return null; if (deltas.size() == 0)
if (deltas.size() == 1) return null;
return (ICElementDelta)deltas.iterator().next(); if (deltas.size() == 1)
if (deltas.size() <= 1) return (ICElementDelta)deltas.iterator().next();
return null; if (deltas.size() <= 1)
return null;
Iterator iterator = deltas.iterator();
ICElement cRoot = getCModel(); Iterator iterator = deltas.iterator();
CElementDelta rootDelta = new CElementDelta(cRoot); ICElement cRoot = getCModel();
boolean insertedTree = false; CElementDelta rootDelta = new CElementDelta(cRoot);
while (iterator.hasNext()) { boolean insertedTree = false;
CElementDelta delta = (CElementDelta)iterator.next(); while (iterator.hasNext()) {
ICElement element = delta.getElement(); CElementDelta delta = (CElementDelta)iterator.next();
if (cRoot.equals(element)) { ICElement element = delta.getElement();
ICElementDelta[] children = delta.getAffectedChildren(); if (cRoot.equals(element)) {
for (int j = 0; j < children.length; j++) { ICElementDelta[] children = delta.getAffectedChildren();
CElementDelta projectDelta = (CElementDelta) children[j]; for (int j = 0; j < children.length; j++) {
rootDelta.insertDeltaTree(projectDelta.getElement(), projectDelta); CElementDelta projectDelta = (CElementDelta) children[j];
rootDelta.insertDeltaTree(projectDelta.getElement(), projectDelta);
insertedTree = true;
}
} else {
rootDelta.insertDeltaTree(element, delta);
insertedTree = true; insertedTree = true;
} }
} else {
rootDelta.insertDeltaTree(element, delta);
insertedTree = true;
} }
} if (insertedTree) {
if (insertedTree) { return rootDelta;
//fCModelDeltas = new ArrayList(1); } else {
//fCModelDeltas.add(rootDelta); return null;
return rootDelta; }
} else {
//fCModelDeltas = new ArrayList(0);
return null;
} }
} }