[288196] Deadlock in ModelManagerImpl after IOException
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 bdc971c..72284d7 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
@@ -330,7 +330,8 @@
URIResolver resolver, ReadEditType rwType, EncodingRule encodingRule,
SharedObject sharedObject) throws CoreException, IOException {
// XXX: Does not integrate with FileBuffers
- boolean doRemove = false;
+ boolean doRemove = true;
+ try {
synchronized(sharedObject) {
InputStream inputStream = null;
IStructuredModel model = null;
@@ -355,16 +356,17 @@
// add to our cache
sharedObject.theSharedModel=model;
_initCount(sharedObject, rwType);
- } else {
- doRemove = true;
+ doRemove = false;
}
}
+ } finally {
if (doRemove) {
SYNC.acquire();
fManagedObjects.remove(id);
SYNC.release();
}
sharedObject.setLoaded();
+ }
}
private IStructuredModel _commonCreateModel(InputStream inputStream, String id, IModelHandler handler, URIResolver resolver, ReadEditType rwType, String encoding, String lineDelimiter) throws IOException {
@@ -416,7 +418,8 @@
private void _doCommonCreateModel(InputStream inputStream, String id, IModelHandler handler,
URIResolver resolver, ReadEditType rwType, String encoding, String lineDelimiter,
SharedObject sharedObject) throws IOException {
- boolean doRemove = false;
+ boolean doRemove = true;
+ try {
synchronized(sharedObject) {
IStructuredModel model = null;
try {
@@ -451,10 +454,10 @@
}
sharedObject.theSharedModel = model;
_initCount(sharedObject, rwType);
- } else {
- doRemove = true;
+ doRemove = false;
}
}
+ }finally{
if (doRemove) {
SYNC.acquire();
// remove it if we didn't get one back
@@ -462,6 +465,7 @@
SYNC.release();
}
sharedObject.setLoaded();
+ }
}
private IStructuredModel _commonCreateModel(String id, IModelHandler handler, URIResolver resolver) throws ResourceInUse {