You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by ge...@apache.org on 2009/03/09 20:50:39 UTC
svn commit: r751811 -
/servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/artifacts/AssemblyReferencesListener.java
Author: gertv
Date: Mon Mar 9 19:50:38 2009
New Revision: 751811
URL: http://svn.apache.org/viewvc?rev=751811&view=rev
Log:
SMX4NMR-116: Avoid deadlock when shutting down SA
Modified:
servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/artifacts/AssemblyReferencesListener.java
Modified: servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/artifacts/AssemblyReferencesListener.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/artifacts/AssemblyReferencesListener.java?rev=751811&r1=751810&r2=751811&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/artifacts/AssemblyReferencesListener.java (original)
+++ servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/artifacts/AssemblyReferencesListener.java Mon Mar 9 19:50:38 2009
@@ -40,10 +40,9 @@
public class AssemblyReferencesListener implements EndpointListener, ExchangeListener {
private final ThreadLocal<ServiceAssembly> assembly = new ThreadLocal<ServiceAssembly>();
- private final ConcurrentMap<InternalEndpoint, ServiceAssembly> endpoints =
- new ConcurrentHashMap<InternalEndpoint, ServiceAssembly>();
- private final ConcurrentMap<ServiceAssembly, AtomicInteger> references =
- new ConcurrentHashMap<ServiceAssembly, AtomicInteger>();
+ private final ConcurrentMap<InternalEndpoint, ServiceAssembly> endpoints = new ConcurrentHashMap<InternalEndpoint, ServiceAssembly>();
+ private final ConcurrentMap<ServiceAssembly, AtomicInteger> references = new ConcurrentHashMap<ServiceAssembly, AtomicInteger>();
+ private final ConcurrentMap<ServiceAssembly, Object> locks = new ConcurrentHashMap<ServiceAssembly, Object>();
public void setAssembly(ServiceAssembly assembly) {
this.assembly.set(assembly);
@@ -58,8 +57,9 @@
AtomicInteger count = references.remove(assembly);
if (count != null) {
count.set(0);
- synchronized (assembly) {
- assembly.notifyAll();
+ Object lock = locks.remove(assembly);
+ synchronized (lock) {
+ lock.notifyAll();
}
}
}
@@ -71,6 +71,9 @@
if (references.get(assembly) == null) {
references.put(assembly, new AtomicInteger());
}
+ if (locks.get(assembly) == null) {
+ locks.put(assembly, new Object());
+ }
}
}
@@ -124,9 +127,10 @@
AtomicInteger count = references.get(assembly);
if (count != null) {
if (count.get() != 0) {
- synchronized (assembly) {
+ Object lock = locks.get(assembly);
+ synchronized (lock) {
while (count.get() != 0) {
- assembly.wait(Long.MAX_VALUE);
+ lock.wait(Long.MAX_VALUE);
}
}
}
@@ -160,8 +164,9 @@
AtomicInteger count = references.get(assembly);
if (count != null) {
if (count.decrementAndGet() == 0) {
- synchronized (assembly) {
- assembly.notifyAll();
+ Object lock = locks.get(assembly);
+ synchronized (lock) {
+ lock.notifyAll();
}
}
}