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:
parent
0eef7aec8a
commit
83de8b24d2
1 changed files with 54 additions and 44 deletions
|
@ -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
|
||||||
|
|
Loading…
Add table
Reference in a new issue