From 2d15d4e65ad3f7b796e22e38a9a930128b284ab9 Mon Sep 17 00:00:00 2001 From: Sebastian Zarnekow Date: Mon, 11 Feb 2013 11:50:28 +0100 Subject: [PATCH] [xbase][typesystem] Guard against concurrent resolution Should prevent dead locks and other surprises. --- .../SynchronizedXtextResourceSet.java | 26 ++++++++++++++++++- .../eclipse/xtext/resource/XtextResource.java | 14 ++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/resource/SynchronizedXtextResourceSet.java b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/resource/SynchronizedXtextResourceSet.java index 5aedec70f..81c581696 100644 --- a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/resource/SynchronizedXtextResourceSet.java +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/resource/SynchronizedXtextResourceSet.java @@ -10,11 +10,14 @@ import org.eclipse.emf.common.util.AbstractEList; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.xtext.util.concurrent.IUnitOfWork; /** * @author Sebastian Zarnekow - Initial contribution and API */ -public class SynchronizedXtextResourceSet extends XtextResourceSet { +public class SynchronizedXtextResourceSet extends XtextResourceSet implements ISynchronizable { private final Object lock = new Object(); @Override @@ -36,6 +39,27 @@ public class SynchronizedXtextResourceSet extends XtextResourceSet { public EList getResources() { return super.getResources(); } + + /** + * Returns a synchronization lock that works for the complete resource set. + * @since 2.4 + */ + @NonNull + public Object getLock() { + return lock; + } + + /** + * {@inheritDoc} + * + * @since 2.4 + */ + @NonNullByDefault + public Result execute(IUnitOfWork unit) throws Exception { + synchronized (getLock()) { + return unit.exec(this); + } + } /** * @since 2.4 diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/resource/XtextResource.java b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/resource/XtextResource.java index 2608a9b6f..a30a24e91 100644 --- a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/resource/XtextResource.java +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/resource/XtextResource.java @@ -23,6 +23,7 @@ import org.eclipse.emf.common.util.TreeIterator; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.impl.ResourceImpl; +import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.eclipse.xtext.Constants; import org.eclipse.xtext.diagnostics.Severity; @@ -285,6 +286,19 @@ public class XtextResource extends ResourceImpl { @Override public EObject getEObject(String uriFragment) { + return basicGetEObject(uriFragment); + } + + /** + * Resolves a fragment to an {@link EObject}. The returned object is not necessarily + * contained in this resource. It may resolve to a different one, instead. + * The result may be null. + * + * @see ResourceImpl#getEObject(String) + * @see IFragmentProvider + * @since 2.4 + */ + protected EObject basicGetEObject(@NonNull String uriFragment) { if (fragmentProvider != null) { EObject result = fragmentProvider.getEObject(this, uriFragment, fragmentProviderFallback); return result;