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/08/17 23:59:07 UTC
svn commit: r1374453 -
/activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/util/concurrent/locks/AbstractQueuedSynchronizer.cpp
Author: tabish
Date: Fri Aug 17 21:59:07 2012
New Revision: 1374453
URL: http://svn.apache.org/viewvc?rev=1374453&view=rev
Log:
Can't assume that platform level locks are reentrant, windows and Mac both have issues here.
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=1374453&r1=1374452&r2=1374453&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 Fri Aug 17 21:59:07 2012
@@ -328,26 +328,6 @@ namespace locks {
PlatformThread::unlockRWMutex(rwLock);
return pred;
-
-// for (;;) {
-// Node* t = tail.get();
-// if (t == NULL) { // Must initialize
-// Node* newHead = new Node();
-// if (compareAndSetHead(newHead)) {
-// tail.set(head.get());
-// } else {
-// delete newHead;
-// }
-// } else {
-// node->prev = t;
-// if (compareAndSetTail(t, node)) {
-// t->next = node;
-// return t;
-// }
-// }
-// }
-
- return NULL;
}
/**
@@ -364,19 +344,6 @@ namespace locks {
Node* node = new Node(Thread::currentThread(), mode);
enqueue(node);
return node;
-
-// Node* node = new Node(Thread::currentThread(), mode);
-// Node* pred = tail.get();
-// if (pred != NULL) {
-// node->prev = pred;
-// if (compareAndSetTail(pred, node)) {
-// pred->next = node;
-// return node;
-// }
-// }
-//
-// enqueue(node);
-// return node;
}
/**
@@ -396,10 +363,6 @@ namespace locks {
node->prev = NULL;
PlatformThread::unlockRWMutex(this->rwLock);
return oldHead;
-
-// head.set(node);
-// node->thread = NULL;
-// node->prev = NULL;
}
/**
@@ -467,7 +430,11 @@ namespace locks {
if (!compareAndSetWaitStatus(h, Node::SIGNAL, 0)) {
continue; // loop to recheck cases
}
+
+ // Platform level lock may not be reentrant.
+ PlatformThread::unlockRWMutex(this->rwLock);
unparkSuccessor(h);
+ PlatformThread::readerLockMutex(this->rwLock);
} else if (ws == 0 && !compareAndSetWaitStatus(h, 0, Node::PROPAGATE)) {
continue; // loop on failed CAS
}
@@ -511,12 +478,15 @@ namespace locks {
if (propagate > 0 || head == NULL || head->waitStatus < 0) {
Node* successor = node->next;
if (successor == NULL || successor->isShared()) {
+ PlatformThread::unlockRWMutex(this->rwLock);
doReleaseShared();
+ } else {
+ PlatformThread::unlockRWMutex(this->rwLock);
}
+ } else {
+ PlatformThread::unlockRWMutex(this->rwLock);
}
- PlatformThread::unlockRWMutex(this->rwLock);
-
return head;
}
@@ -567,49 +537,6 @@ namespace locks {
}
delete node;
-
-// node->thread = NULL;
-//
-// // Can use unconditional write instead of CAS here. After this atomic
-// // step, other Nodes can skip past us. Before, we are free of interference
-// // from other threads.
-// node->waitStatus = Node::CANCELLED;
-//
-// // If we are the tail, remove ourselves.
-// if (node == tail.get() && compareAndSetTail(node, node->prev)) {
-// // Attempt to set next on tail, this can fail if another thread can in
-// // and replaced the old tail but that's ok since that means next is up
-// // to date in that case.
-// Atomics::compareAndSwap<Node>(tail.get()->next, node, NULL);
-// delete node;
-// } else {
-// // If successor needs signal, try to set pred's next-link
-// // so it will get one. Otherwise wake it up to propagate.
-// int ws;
-//
-// PlatformThread::writerLockMutex(this->rwLock);
-//
-// // Did we become the tail.
-// if (node == tail.get() && compareAndSetTail(node, node->prev)) {
-// Atomics::compareAndSwap<Node>(tail.get()->next, node, NULL);
-// } else {
-// node->prev->next = node->next;
-// node->next->prev = node->prev;
-// }
-//
-// if (node->prev != head.get() &&
-// ((ws = node->prev->waitStatus) == Node::SIGNAL ||
-// (ws <= 0 && compareAndSetWaitStatus(node->prev, ws, Node::SIGNAL))) &&
-// node->prev->thread != NULL) {
-//
-// PlatformThread::unlockRWMutex(this->rwLock);
-// } else {
-// PlatformThread::unlockRWMutex(this->rwLock);
-// unparkSuccessor(node);
-// }
-//
-// delete node;
-// }
}
/**