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/07/30 15:42:45 UTC

svn commit: r1367087 - /activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/util/concurrent/ThreadPoolExecutor.cpp

Author: tabish
Date: Mon Jul 30 13:42:44 2012
New Revision: 1367087

URL: http://svn.apache.org/viewvc?rev=1367087&view=rev
Log:
Ensure the lock on the worker queue always get released. 

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=1367087&r1=1367086&r2=1367087&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 Mon Jul 30 13:42:44 2012
@@ -413,12 +413,12 @@ namespace concurrent{
             try {
                 // Remove rare and surprising possibility of
                 // isTerminated() && getPoolSize() > 0
+                mainLock.unlock();
                 return runStateAtLeast(ctl.get(), TIDYING) ? 0 : workers.size();
             } catch(Exception& ex) {
                 mainLock.unlock();
                 throw;
             }
-            mainLock.unlock();
         }
 
         int getActiveCount() {
@@ -432,23 +432,23 @@ namespace concurrent{
                         ++n;
                     }
                 }
+                mainLock.unlock();
                 return n;
             } catch(Exception& ex) {
                 mainLock.unlock();
                 throw;
             }
-            mainLock.unlock();
         }
 
         int getLargestPoolSize() {
             mainLock.lock();
             try {
+                mainLock.unlock();
                 return largestPoolSize;
             } catch(Exception& ex) {
                 mainLock.unlock();
                 throw;
             }
-            mainLock.unlock();
         }
 
         long long getTaskCount() {
@@ -463,12 +463,13 @@ namespace concurrent{
                         ++n;
                     }
                 }
+
+                mainLock.unlock();
                 return n + workQueue->size();
             } catch(Exception& ex) {
                 mainLock.unlock();
                 throw;
             }
-            mainLock.unlock();
         }
 
         long long getCompletedTaskCount() {
@@ -480,12 +481,13 @@ namespace concurrent{
                     Worker* worker = iter->next();
                     n += worker->completedTasks;
                 }
+
+                mainLock.unlock();
                 return n;
             } catch(Exception& ex) {
                 mainLock.unlock();
                 throw;
             }
-            mainLock.unlock();
         }
 
         /**
@@ -843,6 +845,7 @@ namespace concurrent{
                 throw;
             }
             mainLock.unlock();
+            return false;
         }
 
         bool awaitTermination(long long timeout, const TimeUnit& unit) {
@@ -870,6 +873,7 @@ namespace concurrent{
                 throw;
             }
             mainLock.unlock();
+            return false;
         }
 
         void setCorePoolSize(int corePoolSize) {
@@ -1114,6 +1118,7 @@ namespace concurrent{
                 if (t == NULL || (rs >= SHUTDOWN && !(rs == SHUTDOWN && firstTask == NULL))) {
                     decrementWorkerCount();
                     tryTerminate();
+                    mainLock.unlock();
                     return false;
                 }
 
@@ -1255,6 +1260,8 @@ namespace concurrent{
                     timedOut = false;
                 }
             }
+
+            return NULL;
         }
 
         /**
@@ -1305,7 +1312,7 @@ ThreadPoolExecutor::ThreadPoolExecutor(i
 
     try{
 
-        if(workQueue == NULL) {
+        if (workQueue == NULL) {
             throw NullPointerException(__FILE__, __LINE__, "The BlockingQueue pointer cannot be NULL.");
         }