Skip to main content

This CGIT instance is deprecated, and repositories have been moved to Gitlab or Github. See the repository descriptions for specific locations.

summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornitind2008-03-05 23:22:38 +0000
committernitind2008-03-05 23:22:38 +0000
commit5b17094c8c6fa0fb947fb63cdab04253bbc1c1ce (patch)
tree681b03728c4a6a0aca6d9ba17352c5403dac45e3 /bundles/org.eclipse.wst.sse.core/src
parent89b124da0edb36e7d97308d7a6ff1f576478de2d (diff)
downloadwebtools.sourceediting-5b17094c8c6fa0fb947fb63cdab04253bbc1c1ce.tar.gz
webtools.sourceediting-5b17094c8c6fa0fb947fb63cdab04253bbc1c1ce.tar.xz
webtools.sourceediting-5b17094c8c6fa0fb947fb63cdab04253bbc1c1ce.zip
[221610] Possible deadlock when saving and getting same model at same time
Diffstat (limited to 'bundles/org.eclipse.wst.sse.core/src')
-rw-r--r--bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/model/ModelManagerImpl.java51
1 files changed, 28 insertions, 23 deletions
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/model/ModelManagerImpl.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/model/ModelManagerImpl.java
index 40ea741976..39d0b06d5f 100644
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/model/ModelManagerImpl.java
+++ b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/model/ModelManagerImpl.java
@@ -1876,30 +1876,35 @@ public class ModelManagerImpl implements IModelManager {
SYNC.release();
sharedObject.waitForLoadAttempt();
- synchronized(sharedObject) {
- // sync here on to prevent a dispose from yanking the model from us!
- boolean saved = false;
- // if this model was based on a File Buffer and we're writing back
- // to the same location, use the buffer to do the writing
- if (FileBufferModelManager.getInstance().isExistingBuffer(sharedObject.theSharedModel.getStructuredDocument())) {
- ITextFileBuffer buffer = FileBufferModelManager.getInstance().getBuffer(sharedObject.theSharedModel.getStructuredDocument());
- IPath fileLocation = FileBuffers.normalizeLocation(iFile.getFullPath());
- if (fileLocation.equals(buffer.getLocation())) {
- buffer.commit(new NullProgressMonitor(), true);
- saved = true;
- }
- }
- if (!saved) {
- IStructuredModel model = sharedObject.theSharedModel;
- IStructuredDocument document = model.getStructuredDocument();
- saveStructuredDocument(document, iFile, encodingRule);
- trace("saving model", id); //$NON-NLS-1$
+ /**
+ * https://bugs.eclipse.org/bugs/show_bug.cgi?id=221610
+ *
+ * Sync removed from here to prevent deadlock. Although the model
+ * instance may disappear or be made invalid while the save is
+ * happening, the document itself still has the contents we're
+ * trying to save. Simultaneous saves should be throttled by
+ * resource locking without our intervention.
+ */
+ boolean saved = false;
+ // if this model was based on a File Buffer and we're writing back
+ // to the same location, use the buffer to do the writing
+ if (FileBufferModelManager.getInstance().isExistingBuffer(sharedObject.theSharedModel.getStructuredDocument())) {
+ ITextFileBuffer buffer = FileBufferModelManager.getInstance().getBuffer(sharedObject.theSharedModel.getStructuredDocument());
+ IPath fileLocation = FileBuffers.normalizeLocation(iFile.getFullPath());
+ if (fileLocation.equals(buffer.getLocation())) {
+ buffer.commit(new NullProgressMonitor(), true);
+ saved = true;
}
- sharedObject.theSharedModel.setDirtyState(false);
- sharedObject.theSharedModel.setNewState(false);
- }
- }
-
+ }
+ if (!saved) {
+ IStructuredModel model = sharedObject.theSharedModel;
+ IStructuredDocument document = model.getStructuredDocument();
+ saveStructuredDocument(document, iFile, encodingRule);
+ trace("saving model", id); //$NON-NLS-1$
+ }
+ sharedObject.theSharedModel.setDirtyState(false);
+ sharedObject.theSharedModel.setNewState(false);
+ }
}
/**

Back to the top