diff options
author | canderson | 2008-08-21 18:56:05 +0000 |
---|---|---|
committer | canderson | 2008-08-21 18:56:05 +0000 |
commit | b287bf2bb800be4c22cc4e012ede21fc39a9478d (patch) | |
tree | bb9a6edd700628f84b6f9efc9f7430c204eb2096 /plugins | |
parent | 12a4e3cfdce6f2962a8a3fe10b3d64b03b094a00 (diff) | |
download | webtools.common-b287bf2bb800be4c22cc4e012ede21fc39a9478d.tar.gz webtools.common-b287bf2bb800be4c22cc4e012ede21fc39a9478d.tar.xz webtools.common-b287bf2bb800be4c22cc4e012ede21fc39a9478d.zip |
[231205] deadlock closing edited orm.xml file
Diffstat (limited to 'plugins')
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); |