activemq-cpp git commit: https://issues.apache.org/jira/browse/AMQCPP-556

2014-12-01 Thread tabish
Repository: activemq-cpp
Updated Branches:
  refs/heads/3.8.x b7542f28c -> b8aabbf63


https://issues.apache.org/jira/browse/AMQCPP-556

apply fix for deadlock on session stop()


Project: http://git-wip-us.apache.org/repos/asf/activemq-cpp/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq-cpp/commit/b8aabbf6
Tree: http://git-wip-us.apache.org/repos/asf/activemq-cpp/tree/b8aabbf6
Diff: http://git-wip-us.apache.org/repos/asf/activemq-cpp/diff/b8aabbf6

Branch: refs/heads/3.8.x
Commit: b8aabbf6365c37bfd4ae03b575361bd69cdb3717
Parents: b7542f2
Author: Timothy Bish 
Authored: Mon Dec 1 14:35:32 2014 -0500
Committer: Timothy Bish 
Committed: Mon Dec 1 14:38:37 2014 -0500

--
 .../main/activemq/core/ActiveMQSessionExecutor.cpp | 17 ++---
 .../core/kernels/ActiveMQSessionKernel.cpp | 14 ++
 2 files changed, 24 insertions(+), 7 deletions(-)
--


http://git-wip-us.apache.org/repos/asf/activemq-cpp/blob/b8aabbf6/activemq-cpp/src/main/activemq/core/ActiveMQSessionExecutor.cpp
--
diff --git a/activemq-cpp/src/main/activemq/core/ActiveMQSessionExecutor.cpp 
b/activemq-cpp/src/main/activemq/core/ActiveMQSessionExecutor.cpp
index 48a919c..e8477c6 100644
--- a/activemq-cpp/src/main/activemq/core/ActiveMQSessionExecutor.cpp
+++ b/activemq-cpp/src/main/activemq/core/ActiveMQSessionExecutor.cpp
@@ -100,6 +100,9 @@ void ActiveMQSessionExecutor::wakeup() {
 Pointer taskRunner;
 synchronized(messageQueue.get()) {
 if (this->taskRunner == NULL) {
+if (!messageQueue->isRunning()) {
+return;
+}
 this->taskRunner.reset(new DedicatedTaskRunner(this));
 this->taskRunner->start();
 }
@@ -124,21 +127,21 @@ void ActiveMQSessionExecutor::start() {
 

 void ActiveMQSessionExecutor::stop() {
 
-if (messageQueue->isRunning()) {
-messageQueue->stop();
-Pointer taskRunner;
+Pointer taskRunner;
+synchronized(messageQueue.get()) {
+if (messageQueue->isRunning()) {
+messageQueue->stop();
 
-synchronized(messageQueue.get()) {
 taskRunner = this->taskRunner;
 
 if (taskRunner != NULL) {
 this->taskRunner.reset(NULL);
 }
 }
+}
 
-if (taskRunner != NULL) {
-taskRunner->shutdown();
-}
+if (taskRunner != NULL) {
+taskRunner->shutdown();
 }
 }
 

http://git-wip-us.apache.org/repos/asf/activemq-cpp/blob/b8aabbf6/activemq-cpp/src/main/activemq/core/kernels/ActiveMQSessionKernel.cpp
--
diff --git 
a/activemq-cpp/src/main/activemq/core/kernels/ActiveMQSessionKernel.cpp 
b/activemq-cpp/src/main/activemq/core/kernels/ActiveMQSessionKernel.cpp
index 0f320e8..fad69a8 100644
--- a/activemq-cpp/src/main/activemq/core/kernels/ActiveMQSessionKernel.cpp
+++ b/activemq-cpp/src/main/activemq/core/kernels/ActiveMQSessionKernel.cpp
@@ -1100,6 +1100,20 @@ void ActiveMQSessionKernel::start() {
 

 void ActiveMQSessionKernel::stop() {
 
+this->config->consumerLock.readLock().lock();
+try {
+Pointer > > 
iter(this->config->consumers.iterator());
+
+while (iter->hasNext()) {
+Pointer consumer = iter->next();
+consumer->stop();
+}
+this->config->consumerLock.readLock().unlock();
+} catch (Exception& ex) {
+this->config->consumerLock.readLock().unlock();
+throw;
+}
+
 if (this->executor.get() != NULL) {
 this->executor->stop();
 }



activemq-cpp git commit: https://issues.apache.org/jira/browse/AMQCPP-556

2014-12-01 Thread tabish
Repository: activemq-cpp
Updated Branches:
  refs/heads/trunk 84daff398 -> 660d080cd


https://issues.apache.org/jira/browse/AMQCPP-556

apply fix for deadlock on session stop()

Project: http://git-wip-us.apache.org/repos/asf/activemq-cpp/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq-cpp/commit/660d080c
Tree: http://git-wip-us.apache.org/repos/asf/activemq-cpp/tree/660d080c
Diff: http://git-wip-us.apache.org/repos/asf/activemq-cpp/diff/660d080c

Branch: refs/heads/trunk
Commit: 660d080cddb02950d013f83f15c9940b4e93831d
Parents: 84daff3
Author: Timothy Bish 
Authored: Mon Dec 1 14:35:32 2014 -0500
Committer: Timothy Bish 
Committed: Mon Dec 1 14:35:32 2014 -0500

--
 .../main/activemq/core/ActiveMQSessionExecutor.cpp | 17 ++---
 .../core/kernels/ActiveMQSessionKernel.cpp | 14 ++
 2 files changed, 24 insertions(+), 7 deletions(-)
--


http://git-wip-us.apache.org/repos/asf/activemq-cpp/blob/660d080c/activemq-cpp/src/main/activemq/core/ActiveMQSessionExecutor.cpp
--
diff --git a/activemq-cpp/src/main/activemq/core/ActiveMQSessionExecutor.cpp 
b/activemq-cpp/src/main/activemq/core/ActiveMQSessionExecutor.cpp
index 5392950..04b8e60 100644
--- a/activemq-cpp/src/main/activemq/core/ActiveMQSessionExecutor.cpp
+++ b/activemq-cpp/src/main/activemq/core/ActiveMQSessionExecutor.cpp
@@ -107,6 +107,9 @@ void ActiveMQSessionExecutor::wakeup() {
 Pointer taskRunner;
 synchronized(messageQueue.get()) {
 if (this->taskRunner == NULL) {
+if (!messageQueue->isRunning()) {
+return;
+}
 this->taskRunner.reset(new DedicatedTaskRunner(this));
 this->taskRunner->start();
 }
@@ -131,21 +134,21 @@ void ActiveMQSessionExecutor::start() {
 

 void ActiveMQSessionExecutor::stop() {
 
-if (messageQueue->isRunning()) {
-messageQueue->stop();
-Pointer taskRunner;
+Pointer taskRunner;
+synchronized(messageQueue.get()) {
+if (messageQueue->isRunning()) {
+messageQueue->stop();
 
-synchronized(messageQueue.get()) {
 taskRunner = this->taskRunner;
 
 if (taskRunner != NULL) {
 this->taskRunner.reset(NULL);
 }
 }
+}
 
-if (taskRunner != NULL) {
-taskRunner->shutdown();
-}
+if (taskRunner != NULL) {
+taskRunner->shutdown();
 }
 }
 

http://git-wip-us.apache.org/repos/asf/activemq-cpp/blob/660d080c/activemq-cpp/src/main/activemq/core/kernels/ActiveMQSessionKernel.cpp
--
diff --git 
a/activemq-cpp/src/main/activemq/core/kernels/ActiveMQSessionKernel.cpp 
b/activemq-cpp/src/main/activemq/core/kernels/ActiveMQSessionKernel.cpp
index a4c97ac..949d51b 100644
--- a/activemq-cpp/src/main/activemq/core/kernels/ActiveMQSessionKernel.cpp
+++ b/activemq-cpp/src/main/activemq/core/kernels/ActiveMQSessionKernel.cpp
@@ -1103,6 +1103,20 @@ void ActiveMQSessionKernel::start() {
 

 void ActiveMQSessionKernel::stop() {
 
+this->config->consumerLock.readLock().lock();
+try {
+Pointer > > 
iter(this->config->consumers.iterator());
+
+while (iter->hasNext()) {
+Pointer consumer = iter->next();
+consumer->stop();
+}
+this->config->consumerLock.readLock().unlock();
+} catch (Exception& ex) {
+this->config->consumerLock.readLock().unlock();
+throw;
+}
+
 if (this->executor.get() != NULL) {
 this->executor->stop();
 }