1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-31 21:05:37 +02:00

fixed concurrent mod excep plus deadlock wth junits

This commit is contained in:
David Inglis 2004-04-26 21:13:49 +00:00
parent dc57a7a2d1
commit ca2d70f2be
2 changed files with 29 additions and 30 deletions

View file

@ -67,7 +67,7 @@ public class CDescriptor implements ICDescriptor {
private HashMap extInfoMap = new HashMap(4); private HashMap extInfoMap = new HashMap(4);
private Document dataDoc; private Document dataDoc;
static final String DESCRIPTION_FILE_NAME = ".cdtproject"; //$NON-NLS-1$ protected static final String DESCRIPTION_FILE_NAME = ".cdtproject"; //$NON-NLS-1$
private static final String CEXTENSION_NAME = "cextension"; //$NON-NLS-1$ private static final String CEXTENSION_NAME = "cextension"; //$NON-NLS-1$

View file

@ -10,6 +10,7 @@
package org.eclipse.cdt.internal.core; package org.eclipse.cdt.internal.core;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
@ -19,7 +20,6 @@ import java.util.Map.Entry;
import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.CDescriptorEvent; import org.eclipse.cdt.core.CDescriptorEvent;
import org.eclipse.cdt.core.CProjectNature;
import org.eclipse.cdt.core.ICDescriptor; import org.eclipse.cdt.core.ICDescriptor;
import org.eclipse.cdt.core.ICDescriptorListener; import org.eclipse.cdt.core.ICDescriptorListener;
import org.eclipse.cdt.core.ICDescriptorManager; import org.eclipse.cdt.core.ICDescriptorManager;
@ -50,7 +50,7 @@ public class CDescriptorManager implements ICDescriptorManager, IResourceChangeL
Map fOperationMap = new HashMap(1); Map fOperationMap = new HashMap(1);
Map fDescriptorMap = new HashMap(); Map fDescriptorMap = new HashMap();
Map fOwnerConfigMap = null; Map fOwnerConfigMap = null;
List listeners = new Vector(); List listeners = Collections.synchronizedList(new Vector());
private static final COwnerConfiguration NULLCOwner = new COwnerConfiguration("", //$NON-NLS-1$ private static final COwnerConfiguration NULLCOwner = new COwnerConfiguration("", //$NON-NLS-1$
CCorePlugin.getResourceString("CDescriptorManager.internal_owner")); //$NON-NLS-1$ CCorePlugin.getResourceString("CDescriptorManager.internal_owner")); //$NON-NLS-1$
@ -92,8 +92,8 @@ public class CDescriptorManager implements ICDescriptorManager, IResourceChangeL
public boolean visit(IResource resource) { public boolean visit(IResource resource) {
if (resource.getType() == IResource.PROJECT) { if (resource.getType() == IResource.PROJECT) {
IProject project = (IProject) resource; IProject project = (IProject) resource;
try { try { // seed in memory descriptor map
if (project.isAccessible() && project.hasNature(CProjectNature.C_NATURE_ID)) { if (project.isAccessible() && project.findMember(CDescriptor.DESCRIPTION_FILE_NAME) != null) {
getDescriptor(project); getDescriptor(project);
} }
} catch (CoreException e) { } catch (CoreException e) {
@ -120,15 +120,11 @@ public class CDescriptorManager implements ICDescriptorManager, IResourceChangeL
switch (event.getType()) { switch (event.getType()) {
case IResourceChangeEvent.PRE_DELETE : case IResourceChangeEvent.PRE_DELETE :
case IResourceChangeEvent.PRE_CLOSE : case IResourceChangeEvent.PRE_CLOSE :
try { if (resource.getType() == IResource.PROJECT) {
if (resource.getType() == IResource.PROJECT && ((IProject) resource).hasNature(CProjectNature.C_NATURE_ID)) { CDescriptor descriptor = (CDescriptor) fDescriptorMap.remove(resource);
CDescriptor descriptor = (CDescriptor) fDescriptorMap.remove(resource); if (descriptor != null) {
if (descriptor != null) { fireEvent(new CDescriptorEvent(descriptor, CDescriptorEvent.CDTPROJECT_REMOVED, 0));
fireEvent(new CDescriptorEvent(descriptor, CDescriptorEvent.CDTPROJECT_REMOVED, 0));
}
} }
} catch (CoreException e) {
CCorePlugin.log(e);
} }
break; break;
case IResourceChangeEvent.PRE_AUTO_BUILD : case IResourceChangeEvent.PRE_AUTO_BUILD :
@ -144,8 +140,9 @@ public class CDescriptorManager implements ICDescriptorManager, IResourceChangeL
if (dResource.getType() == IResource.PROJECT) { if (dResource.getType() == IResource.PROJECT) {
if (0 != (delta.getFlags() & IResourceDelta.OPEN)) { if (0 != (delta.getFlags() & IResourceDelta.OPEN)) {
IProject project = (IProject) dResource; IProject project = (IProject) dResource;
if (project.isAccessible() && project.hasNature(CProjectNature.C_NATURE_ID)) { if (project.isAccessible() && project.findMember(CDescriptor.DESCRIPTION_FILE_NAME) != null
getDescriptor(project); && fDescriptorMap.get(project) == null) {
getDescriptor(project); // file on disk but not in memory...read
} else { } else {
CDescriptor descriptor = (CDescriptor) fDescriptorMap.remove(project); CDescriptor descriptor = (CDescriptor) fDescriptorMap.remove(project);
if (descriptor != null) { if (descriptor != null) {
@ -310,29 +307,31 @@ public class CDescriptorManager implements ICDescriptorManager, IResourceChangeL
fOperationMap.put(event.getDescriptor(), event); fOperationMap.put(event.getDescriptor(), event);
} else { } else {
CDescriptorEvent ev = (CDescriptorEvent) fOperationMap.get(event.getDescriptor()); CDescriptorEvent ev = (CDescriptorEvent) fOperationMap.get(event.getDescriptor());
if ( ev == null) { if (ev == null) {
fOperationMap.put(event.getDescriptor(), event); fOperationMap.put(event.getDescriptor(), event);
} else if ((ev.getFlags() & event.getFlags()) != event.getFlags()) { } else if ((ev.getFlags() & event.getFlags()) != event.getFlags()) {
fOperationMap.put(event.getDescriptor(), new CDescriptorEvent(event.getDescriptor(), event.getType(), ev.getFlags() | event.getFlags())); fOperationMap.put(event.getDescriptor(), new CDescriptorEvent(event.getDescriptor(), event.getType(),
ev.getFlags() | event.getFlags()));
} }
} }
return; return;
} }
final Iterator iterator = listeners.iterator(); synchronized (listeners) {
while (iterator.hasNext()) { final Iterator iterator = listeners.iterator();
Platform.run(new ISafeRunnable() { while (iterator.hasNext()) {
Platform.run(new ISafeRunnable() {
public void handleException(Throwable exception) { public void handleException(Throwable exception) {
IStatus status = new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, -1, IStatus status = new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, -1,
CCorePlugin.getResourceString("CDescriptorManager.exception.listenerError"), exception); //$NON-NLS-1$ CCorePlugin.getResourceString("CDescriptorManager.exception.listenerError"), exception); //$NON-NLS-1$
CCorePlugin.log(status); CCorePlugin.log(status);
iterator.next(); // increment the iterator remove infinite loop }
}
public void run() throws Exception { public void run() throws Exception {
((ICDescriptorListener) iterator.next()).descriptorChanged(event); ((ICDescriptorListener) iterator.next()).descriptorChanged(event);
} }
}); });
}
} }
} }