[231205] deadlock closing edited orm.xml file
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 1b34804..db9fe94 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 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 57cd396..64b9a5c 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 @@
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 d925245..5d09434 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 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 35f1f33..d36ea59 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 @@
* 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 @@
*/
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 6d74981..0a8d2f8 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 @@
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 @@
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 @@
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 b913a42..9547914 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 @@
}
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);