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/10/10 15:11:55 UTC

svn commit: r1396583 - /activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/util/concurrent/locks/AbstractQueuedSynchronizer.cpp

Author: tabish
Date: Wed Oct 10 13:11:54 2012
New Revision: 1396583

URL: http://svn.apache.org/viewvc?rev=1396583&view=rev
Log:
refactoring to attempt a fix for: https://issues.apache.org/jira/browse/AMQCPP-405

Modified:
    activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/util/concurrent/locks/AbstractQueuedSynchronizer.cpp

Modified: activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/util/concurrent/locks/AbstractQueuedSynchronizer.cpp
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/util/concurrent/locks/AbstractQueuedSynchronizer.cpp?rev=1396583&r1=1396582&r2=1396583&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/util/concurrent/locks/AbstractQueuedSynchronizer.cpp (original)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/util/concurrent/locks/AbstractQueuedSynchronizer.cpp Wed Oct 10 13:11:54 2012
@@ -245,25 +245,14 @@ namespace {
 
         Node head;
         Node* tail;
+        int size;
         decaf_mutex_t lock;
 
     public:
 
-        NodePool() : head(), tail(NULL), lock() {
+        NodePool() : head(), tail(NULL), size(0), lock() {
             PlatformThread::createMutex(&lock);
 
-            for (int i = 0; i < 100; ++i) {
-                Node* node = new Node();
-                Node* t = tail;
-
-                if (t != NULL) {
-                    t->nextFree = node;
-                    tail = node;
-                } else {
-                    tail = node;
-                    head.nextFree = tail;
-                }
-            }
         }
 
         ~NodePool() {
@@ -294,37 +283,7 @@ namespace {
         }
 
         Node* takeNode(Thread* thread, int waitStatus, Node* nextWaiter) {
-
-            Node* result = NULL;
-
-            if (head.nextFree != NULL) {
-                PlatformThread::lockMutex(lock);
-
-                if (head.nextFree != NULL) {
-                    result = head.nextFree;
-                    head.nextFree = result->nextFree;
-
-                    if (result == tail) {
-                        tail = NULL;
-                    }
-                }
-
-                PlatformThread::unlockMutex(lock);
-            }
-
-            if (result == NULL) {
-                result = new Node(thread, waitStatus, nextWaiter);
-            } else {
-                // Reset to the new state.
-                result->thread = thread;
-                result->waitStatus = waitStatus;
-                result->nextWaiter = nextWaiter;
-                result->prev = NULL;
-                result->next = NULL;
-                result->nextFree = NULL;
-            }
-
-            return result;
+            return new Node(thread, waitStatus, nextWaiter);
         }
 
         void returnNode(Node* node) {
@@ -336,6 +295,7 @@ namespace {
             PlatformThread::lockMutex(lock);
 
             Node* t = tail;
+            size++;
 
             if (t != NULL) {
                 t->nextFree = node;
@@ -346,6 +306,13 @@ namespace {
                 head.nextFree = tail;
             }
 
+            if (size == 50) {
+                Node* toDelete = head.nextFree;
+                head.nextFree = toDelete->nextFree;
+                delete toDelete;
+                size--;
+            }
+
             PlatformThread::unlockMutex(lock);
         }
     };