Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcanderson2008-08-21 18:56:05 +0000
committercanderson2008-08-21 18:56:05 +0000
commitb287bf2bb800be4c22cc4e012ede21fc39a9478d (patch)
treebb9a6edd700628f84b6f9efc9f7430c204eb2096 /plugins
parent12a4e3cfdce6f2962a8a3fe10b3d64b03b094a00 (diff)
downloadwebtools.common-b287bf2bb800be4c22cc4e012ede21fc39a9478d.tar.gz
webtools.common-b287bf2bb800be4c22cc4e012ede21fc39a9478d.tar.xz
webtools.common-b287bf2bb800be4c22cc4e012ede21fc39a9478d.zip
[231205] deadlock closing edited orm.xml file
Diffstat (limited to 'plugins')
-rw-r--r--plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityXMIResourceImpl.java34
-rw-r--r--plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ReferencedXMIResourceImpl.java2
-rw-r--r--plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorResourceImpl.java14
-rw-r--r--plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ResourceIsLoadingAdapter.java7
-rw-r--r--plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EMFWorkbenchEditContextFactory.java5
-rw-r--r--plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModuleStructuralModel.java2
6 files changed, 50 insertions, 14 deletions
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityXMIResourceImpl.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityXMIResourceImpl.java
index 1b34804a5..db9fe948d 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityXMIResourceImpl.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityXMIResourceImpl.java
@@ -271,13 +271,47 @@ public class CompatibilityXMIResourceImpl extends XMIResourceImpl implements Com
}
}
}
+ public void loadExisting(Map options) throws IOException {
+
+
+ ResourceIsLoadingAdapter adapter = null;
+ if (isLoaded) {
+ adapter = ResourceIsLoadingAdapter.findAdapter(this);
+ if (adapter != null)
+ adapter.waitForResourceToLoad();
+ return;
+ }
+ synchronized (this) {
+ adapter = ResourceIsLoadingAdapter.findAdapter(this);
+ if (adapter == null && !isLoaded)
+ addSynchronizationLoadingAdapter();
+ }
+ if(adapter != null)
+ adapter.waitForResourceToLoad();
+ else {
+ try {
+ load((InputStream) null, options);
+ } catch(IOException ioe) {
+ removeLoadingSynchronizationAdapter();
+ throw ioe;
+ } catch(RuntimeException re) {
+ removeLoadingSynchronizationAdapter();
+ throw re;
+ } catch(Error e) {
+ removeLoadingSynchronizationAdapter();
+ throw e;
+ }
+ }
+ }
/**
*
*/
protected void addSynchronizationLoadingAdapter() {
+ synchronized (eAdapters()) {
if (ResourceIsLoadingAdapter.findAdapter(this) == null)
eAdapters().add(ResourceIsLoadingAdapterFactory.INSTANCE.createResourceIsLoadingAdapter());
+ }
}
/**
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ReferencedXMIResourceImpl.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ReferencedXMIResourceImpl.java
index 57cd39624..64b9a5cdc 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ReferencedXMIResourceImpl.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ReferencedXMIResourceImpl.java
@@ -327,7 +327,7 @@ public class ReferencedXMIResourceImpl extends CompatibilityXMIResourceImpl impl
setForceRefresh(false);
setModified(false); //dcb - this is required to ensure that resources without files are
// marked as not modified.
- if (readReferenceCount == 0 && editReferenceCount == 0) {
+ if (readReferenceCount == 0 && editReferenceCount == 0 && getResourceSet() != null) {
getResourceSet().getResources().remove(this);
}
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorResourceImpl.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorResourceImpl.java
index d925245b1..5d09434df 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorResourceImpl.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorResourceImpl.java
@@ -381,18 +381,16 @@ public abstract class TranslatorResourceImpl extends ReferencedXMIResourceImpl i
}
public void load(Map options) throws IOException {
- synchronized (this) {
- if (isLoaded)
+
+ if (isLoaded())
return;
- // System.out.println(Thread.currentThread() + "
- // TranslatorResource.load(): " + this);
+
if (renderer.useStreamsForIO()) {
super.load(options);
}
- else if (!isLoaded) {
- load((InputStream) null, options);
+ else if (!isLoaded()) {
+ isShared();
+ loadExisting(options);
}
- }
-
}
}
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ResourceIsLoadingAdapter.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ResourceIsLoadingAdapter.java
index 35f1f3354..d36ea591b 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ResourceIsLoadingAdapter.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ResourceIsLoadingAdapter.java
@@ -42,9 +42,10 @@ public class ResourceIsLoadingAdapter extends AdapterImpl implements Adapter {
* removeIsLoadingSupport() will coordinate with this
* synchronization.
*/
- synchronized (aResource) {
- adapter = (ResourceIsLoadingAdapter) EcoreUtil.getAdapter(aResource.eAdapters(), ResourceIsLoadingAdapter.class);
+ synchronized(aResource.eAdapters()) {
+ adapter = (ResourceIsLoadingAdapter) EcoreUtil.getAdapter(aResource.eAdapters(), ResourceIsLoadingAdapter.class);
}
+
return adapter;
}
@@ -88,7 +89,7 @@ public class ResourceIsLoadingAdapter extends AdapterImpl implements Adapter {
*/
if (getTarget() != null) {
//System.out.println("ResourceIsLoadingAdapter Synchronizing on " + getTarget());
- synchronized (getTarget()) {
+ synchronized (getTarget().eAdapters()) {
getTarget().eAdapters().remove(this);
}
}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EMFWorkbenchEditContextFactory.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EMFWorkbenchEditContextFactory.java
index 6d74981f5..0a8d2f87f 100644
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EMFWorkbenchEditContextFactory.java
+++ b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EMFWorkbenchEditContextFactory.java
@@ -19,9 +19,9 @@ package org.eclipse.wst.common.internal.emfworkbench.edit;
import java.util.Hashtable;
import java.util.Map;
+import org.eclipse.core.internal.jobs.LockManager;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.jobs.ILock;
-import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.jem.internal.util.emf.workbench.EMFWorkbenchContextFactory;
import org.eclipse.jem.util.emf.workbench.EMFWorkbenchContextBase;
@@ -54,6 +54,7 @@ public class EMFWorkbenchEditContextFactory extends EMFWorkbenchContextFactory {
return new ResourceSetWorkbenchEditSynchronizer(aResourceSet, aProject);
}
+ protected static LockManager lockManager = new LockManager();
protected static Map projectLocks = new Hashtable();
public static ILock getProjectLockObject(IProject aProject){
@@ -64,7 +65,7 @@ public class EMFWorkbenchEditContextFactory extends EMFWorkbenchContextFactory {
synchronized (projectLocks) {
ILock lock = (ILock)projectLocks.get(hashCode);
if(lock == null){
- lock = Job.getJobManager().newLock();
+ lock = lockManager.newLock();
projectLocks.put(hashCode, lock);
}
return lock;
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModuleStructuralModel.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModuleStructuralModel.java
index fe063a579..a6ce890e7 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModuleStructuralModel.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModuleStructuralModel.java
@@ -98,6 +98,8 @@ public class ModuleStructuralModel extends EditModel implements IAdaptable {
}
protected boolean removeResource(Resource aResource) {
if (aResource != null) {
+ //First checking if resource is loaded (Which will prevent removing in middle of loading by checking resource adapter lock)
+ aResource.isLoaded();
synchronized (aResource) {
aResource.eAdapters().remove(resourceAdapter);
return getResources().remove(aResource);

Back to the top