Bug 396697 - Deadlock in TransformerHook.recordClassDefine()
diff --git a/features/org.eclipse.objectteams.otequinox.feature/feature.xml b/features/org.eclipse.objectteams.otequinox.feature/feature.xml
index 22792fc..1609d3a 100644
--- a/features/org.eclipse.objectteams.otequinox.feature/feature.xml
+++ b/features/org.eclipse.objectteams.otequinox.feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.objectteams.otequinox"
       label="%featureName"
-      version="2.1.0.qualifier"
+      version="2.2.0.qualifier"
       provider-name="%providerName"
       plugin="org.eclipse.objectteams.otequinox"
       colocation-affinity="org.eclipse.rcp">
diff --git a/plugins/org.eclipse.objectteams.otequinox.hook/META-INF/MANIFEST.MF b/plugins/org.eclipse.objectteams.otequinox.hook/META-INF/MANIFEST.MF
index e9c3301..49d25ba 100644
--- a/plugins/org.eclipse.objectteams.otequinox.hook/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.objectteams.otequinox.hook/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.objectteams.otequinox.hook
-Bundle-Version: 2.1.0.qualifier
+Bundle-Version: 2.2.0.qualifier
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
 Fragment-Host: org.eclipse.osgi;bundle-version="[3.7.0,4.0.0)"
diff --git a/plugins/org.eclipse.objectteams.otequinox.hook/src/org/eclipse/objectteams/otequinox/internal/hook/TransformerHook.java b/plugins/org.eclipse.objectteams.otequinox.hook/src/org/eclipse/objectteams/otequinox/internal/hook/TransformerHook.java
index f6808c5..d27c18b 100644
--- a/plugins/org.eclipse.objectteams.otequinox.hook/src/org/eclipse/objectteams/otequinox/internal/hook/TransformerHook.java
+++ b/plugins/org.eclipse.objectteams.otequinox.hook/src/org/eclipse/objectteams/otequinox/internal/hook/TransformerHook.java
@@ -851,13 +851,15 @@
 				shouldTrigger = true;
 		}
 		// perform scheduled activations:
-		if (shouldTrigger)
+		if (shouldTrigger) {
+			Bundle[] copy;
 			synchronized (this.activatableBundles) {
-				Bundle[] copy = this.activatableBundles.toArray(new Bundle[this.activatableBundles.size()]);
-				for (Bundle bundle : copy)
-					BaseBundleRole.endActivation(this.bundleRegistry, bundle, this.aspectRegistry, this.teamLoadingService);
+				copy = this.activatableBundles.toArray(new Bundle[this.activatableBundles.size()]);
 				this.activatableBundles.clear();
 			}
+			for (Bundle bundle : copy)
+				BaseBundleRole.endActivation(this.bundleRegistry, bundle, this.aspectRegistry, this.teamLoadingService);
+		}
 
 		if (name.startsWith("org.objectteams")) {
 			if (name.equals(ORG_OBJECTTEAMS_TEAM))
diff --git a/plugins/org.eclipse.objectteams.otequinox/META-INF/MANIFEST.MF b/plugins/org.eclipse.objectteams.otequinox/META-INF/MANIFEST.MF
index 693b310..68de648 100644
--- a/plugins/org.eclipse.objectteams.otequinox/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.objectteams.otequinox/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.objectteams.otequinox;singleton:=true
-Bundle-Version: 2.1.0.qualifier
+Bundle-Version: 2.2.0.qualifier
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
 Require-Bundle: org.eclipse.equinox.common;bundle-version="[3.6.0,4.0.0)",
diff --git a/plugins/org.eclipse.objectteams.otequinox/about.ini b/plugins/org.eclipse.objectteams.otequinox/about.ini
index fb4d01e..06091aa 100644
--- a/plugins/org.eclipse.objectteams.otequinox/about.ini
+++ b/plugins/org.eclipse.objectteams.otequinox/about.ini
@@ -1,8 +1,8 @@
 aboutText=Object Teams -- Equinox integration (OT/Equinox)\n\
 \n\
-OT/Equinox Version: 2.1.0\n\
+Version: 2.2.0 M4\n\
 \n\
-Part of the Eclipse Juno Simultaneous Release\n\
+Part of the Eclipse Kepler Simultaneous Release\n\
 \n\
 (c) Copyright Technical University Berlin and others, 2005, 2012\n\
 Visit http://www.eclipse.org/objectteams\n\
diff --git a/plugins/org.eclipse.objectteams.otequinox/src/org/eclipse/objectteams/otequinox/internal/ASMByteCodeAnalyzer.java b/plugins/org.eclipse.objectteams.otequinox/src/org/eclipse/objectteams/otequinox/internal/ASMByteCodeAnalyzer.java
index 9606417..4544d37 100644
--- a/plugins/org.eclipse.objectteams.otequinox/src/org/eclipse/objectteams/otequinox/internal/ASMByteCodeAnalyzer.java
+++ b/plugins/org.eclipse.objectteams.otequinox/src/org/eclipse/objectteams/otequinox/internal/ASMByteCodeAnalyzer.java
@@ -20,6 +20,7 @@
 import java.io.InputStream;

 import java.util.HashMap;

 import java.util.Map;

+import java.util.concurrent.ConcurrentHashMap;

 

 import org.eclipse.objectteams.otequinox.hook.IByteCodeAnalyzer;

 import org.objectweb.asm.ClassReader;

@@ -77,7 +78,8 @@
 		}

 	}

 

-	private Map<String, ClassInformation> classInformationMap = new HashMap<String, ClassInformation>();

+	private Map<String, ClassInformation> classInformationMap =

+			new ConcurrentHashMap<String, ClassInformation>(512, 0.75f, 4);

 

 	/** 

 	 * {@inheritDoc}

@@ -111,19 +113,17 @@
 	private ClassInformation getClassInformation(byte[] classBytes,

 			InputStream classStream, String className) throws IOException 

 	{

-		synchronized (this.classInformationMap) {

-			ClassInformation classInformation = classInformationMap.get(className);

-			if (classInformation != null) {

-				return classInformation;

-			}

-			if (classBytes != null) {

-				classInformation = this.getClassInformationPrivate(classBytes);

-			} else {

-				classInformation = this.getClassInformationPrivate(classStream);

-			}

-			classInformationMap.put(className, classInformation);

+		ClassInformation classInformation = classInformationMap.get(className);

+		if (classInformation != null) {

 			return classInformation;

 		}

+		if (classBytes != null) {

+			classInformation = this.getClassInformationPrivate(classBytes);

+		} else {

+			classInformation = this.getClassInformationPrivate(classStream);

+		}

+		classInformationMap.put(className, classInformation);

+		return classInformation;

 	}

 

 

diff --git a/releng/map/otdt.map b/releng/map/otdt.map
index 6f0a815..bf6c6bf 100644
--- a/releng/map/otdt.map
+++ b/releng/map/otdt.map
@@ -4,7 +4,7 @@
 feature@org.eclipse.objectteams.otdt=GIT,repo=git://git.eclipse.org/gitroot/objectteams/org.eclipse.objectteams.git,path=features/org.eclipse.objectteams.otdt.feature

 feature@org.eclipse.objectteams.otdt.source.feature=GIT,repo=git://git.eclipse.org/gitroot/objectteams/org.eclipse.objectteams.git,path=features/org.eclipse.objectteams.otdt.source.feature

 feature@org.eclipse.objectteams.otdt.core.patch=GIT,repo=git://git.eclipse.org/gitroot/objectteams/org.eclipse.objectteams.git,path=features/org.eclipse.objectteams.otdt.core.patch

-feature@org.eclipse.objectteams.otequinox=GIT,repo=git://git.eclipse.org/gitroot/objectteams/org.eclipse.objectteams.git,path=features/org.eclipse.objectteams.otequinox.feature,tag=builds/201206090452

+feature@org.eclipse.objectteams.otequinox=GIT,repo=git://git.eclipse.org/gitroot/objectteams/org.eclipse.objectteams.git,path=features/org.eclipse.objectteams.otequinox.feature

 

 !-- Also don't use version numbers for those plugins that hold the various otre jars: --

 plugin@org.eclipse.jdt.core,3.9.0.v_OTDT_r220_qualifier=GIT,repo=git://git.eclipse.org/gitroot/objectteams/org.eclipse.objectteams.git,path=org.eclipse.jdt.core

@@ -19,10 +19,10 @@
 plugin@org.eclipse.objectteams.otdt.metrics,0.7.0=GIT,repo=git://git.eclipse.org/gitroot/objectteams/org.eclipse.objectteams.git,path=plugins/org.eclipse.objectteams.otdt.metrics,tag=builds/201101290806

 

 plugin@org.eclipse.objectteams.runtime=GIT,repo=git://git.eclipse.org/gitroot/objectteams/org.eclipse.objectteams.git,path=plugins/org.eclipse.objectteams.runtime

-fragment@org.eclipse.objectteams.otequinox.hook,2.1.0=GIT,repo=git://git.eclipse.org/gitroot/objectteams/org.eclipse.objectteams.git,path=plugins/org.eclipse.objectteams.otequinox.hook,tag=builds/201206090452

+fragment@org.eclipse.objectteams.otequinox.hook,2.2.0=GIT,repo=git://git.eclipse.org/gitroot/objectteams/org.eclipse.objectteams.git,path=plugins/org.eclipse.objectteams.otequinox.hook

 fragment@org.eclipse.objectteams.otequinox.sunjvm,2.0.0=GIT,repo=git://git.eclipse.org/gitroot/objectteams/org.eclipse.objectteams.git,path=plugins/org.eclipse.objectteams.otequinox.sunjvm,tag=builds/201109201811

 !the following is also referenced in otdt.doc/buildDoc.xml (plugin-name without version):

-plugin@org.eclipse.objectteams.otequinox=GIT,repo=git://git.eclipse.org/gitroot/objectteams/org.eclipse.objectteams.git,path=plugins/org.eclipse.objectteams.otequinox,tag=builds/201206090452

+plugin@org.eclipse.objectteams.otequinox=GIT,repo=git://git.eclipse.org/gitroot/objectteams/org.eclipse.objectteams.git,path=plugins/org.eclipse.objectteams.otequinox

 plugin@org.eclipse.objectteams.eclipse.monitor,2.0.0=GIT,repo=git://git.eclipse.org/gitroot/objectteams/org.eclipse.objectteams.git,path=plugins/org.eclipse.objectteams.eclipse.monitor

 

 !not currently maintained: