diff options
author | nitind | 2008-03-05 23:22:38 +0000 |
---|---|---|
committer | nitind | 2008-03-05 23:22:38 +0000 |
commit | 5b17094c8c6fa0fb947fb63cdab04253bbc1c1ce (patch) | |
tree | 681b03728c4a6a0aca6d9ba17352c5403dac45e3 /bundles/org.eclipse.wst.sse.core/src | |
parent | 89b124da0edb36e7d97308d7a6ff1f576478de2d (diff) | |
download | webtools.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.java | 51 |
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); + } } /** |