You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by ta...@apache.org on 2012/11/29 17:05:26 UTC
svn commit: r1415229 -
/activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/util/concurrent/ThreadPoolExecutor.cpp
Author: tabish
Date: Thu Nov 29 16:05:26 2012
New Revision: 1415229
URL: http://svn.apache.org/viewvc?rev=1415229&view=rev
Log:
fix for: https://issues.apache.org/jira/browse/AMQCPP-405
safer ThreadPoolExecutor destructor logic.
Modified:
activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/util/concurrent/ThreadPoolExecutor.cpp
Modified: activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/util/concurrent/ThreadPoolExecutor.cpp
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/util/concurrent/ThreadPoolExecutor.cpp?rev=1415229&r1=1415228&r2=1415229&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/util/concurrent/ThreadPoolExecutor.cpp (original)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/util/concurrent/ThreadPoolExecutor.cpp Thu Nov 29 16:05:26 2012
@@ -244,13 +244,17 @@ namespace concurrent{
virtual void run() {
kernel->mainLock.lock();
- try{
- Pointer< Iterator<Worker*> > iter( kernel->deadWorkers.iterator() );
- while(iter->hasNext()) {
- delete iter->next();
- iter->remove();
- }
- } catch(...) {}
+
+ if (!kernel->isTerminated()) {
+ try {
+ Pointer< Iterator<Worker*> > iter( kernel->deadWorkers.iterator() );
+ while(iter->hasNext()) {
+ delete iter->next();
+ iter->remove();
+ }
+ } catch(...) {}
+ }
+
kernel->mainLock.unlock();
}
};
@@ -384,8 +388,16 @@ namespace concurrent{
// Turn off the cleanup timer first so that it doesn't fire while
// we transition all the remaining workers into the dead workers
- // queue while can lead to lock contention.
- this->cleanupTimer.cancel();
+ // queue while can lead to lock contention. Its run method holds
+ // the mainLock so we need to wait for its release before moving on.
+ try {
+ this->mainLock.lock();
+ this->cleanupTimer.cancel();
+ this->cleanupTimer.purge();
+ this->mainLock.unlock();
+ } catch(Exception& ex) {
+ this->mainLock.unlock();
+ }
this->shutdown();
this->awaitTermination();