summaryrefslogtreecommitdiff
path: root/qpid/cpp
diff options
context:
space:
mode:
Diffstat (limited to 'qpid/cpp')
-rw-r--r--qpid/cpp/src/qpid/broker/AsyncCompletion.h5
-rw-r--r--qpid/cpp/src/qpid/ha/Primary.cpp1
2 files changed, 4 insertions, 2 deletions
diff --git a/qpid/cpp/src/qpid/broker/AsyncCompletion.h b/qpid/cpp/src/qpid/broker/AsyncCompletion.h
index 1ab69f32d3..cb5d58977b 100644
--- a/qpid/cpp/src/qpid/broker/AsyncCompletion.h
+++ b/qpid/cpp/src/qpid/broker/AsyncCompletion.h
@@ -111,13 +111,14 @@ class AsyncCompletion : public virtual RefCounted
qpid::sys::Mutex::ScopedLock l(callbackLock);
if (active) {
if (callback.get()) {
+ boost::intrusive_ptr<Callback> save = callback;
+ callback = boost::intrusive_ptr<Callback>(); // Nobody else can run callback.
inCallback = true;
{
qpid::sys::Mutex::ScopedUnlock ul(callbackLock);
- callback->completed(sync);
+ save->completed(sync);
}
inCallback = false;
- callback = boost::intrusive_ptr<Callback>();
callbackLock.notifyAll();
}
active = false;
diff --git a/qpid/cpp/src/qpid/ha/Primary.cpp b/qpid/cpp/src/qpid/ha/Primary.cpp
index 0e87346ac1..870e4723b2 100644
--- a/qpid/cpp/src/qpid/ha/Primary.cpp
+++ b/qpid/cpp/src/qpid/ha/Primary.cpp
@@ -482,6 +482,7 @@ shared_ptr<PrimaryTxObserver> Primary::makeTxObserver(
{
shared_ptr<PrimaryTxObserver> observer =
PrimaryTxObserver::create(*this, haBroker, txBuffer);
+ sys::Mutex::ScopedLock l(lock);
txMap[observer->getTxQueue()->getName()] = observer;
return observer;
}