Author: gsim
Date: Fri Nov 9 07:35:49 2007
New Revision: 593569
URL: http://svn.apache.org/viewvc?rev=593569&view=rev
Log:
Fix race in destruction of serializer.
Modified:
incubator/qpid/trunk/qpid/cpp/src/qpid/sys/Serializer.cpp
incubator/qpid/trunk/qpid/cpp/src/qpid/sys/Serializer.h
Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/sys/Serializer.cpp
URL:
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/sys/Serializer.cpp?rev=593569&r1=593568&r2=593569&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/sys/Serializer.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/sys/Serializer.cpp Fri Nov 9
07:35:49 2007
@@ -36,9 +36,10 @@
notifyDispatch = boost::bind(&SerializerBase::notifyWorker, this);
}
-SerializerBase::~SerializerBase() {
+void SerializerBase::shutdown() {
{
Mutex::ScopedLock l(lock);
+ if (state == SHUTDOWN) return;
state = SHUTDOWN;
lock.notify();
}
Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/sys/Serializer.h
URL:
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/sys/Serializer.h?rev=593569&r1=593568&r2=593569&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/sys/Serializer.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/sys/Serializer.h Fri Nov 9 07:35:49
2007
@@ -46,7 +46,7 @@
/** @see Serializer::Serializer */
SerializerBase(bool immediate=true, VoidFn0 notifyDispatch=VoidFn0());
- virtual ~SerializerBase();
+ virtual ~SerializerBase() { shutdown(); }
virtual void dispatch() = 0;
protected:
@@ -57,6 +57,7 @@
SHUTDOWN ///< SerailizerBase is being destroyed.
};
+ void shutdown();
void notifyWorker();
void run();
virtual bool empty() = 0;
@@ -101,7 +102,8 @@
*/
Serializer(bool immediate=true, VoidFn0 notifyDispatch=VoidFn0())
: SerializerBase(immediate, notifyDispatch) {}
-
+
+ ~Serializer() { shutdown(); }
/**
* Task may be executed immediately in the calling thread if there
* are no other tasks pending or executing and the "immediate"
@@ -166,11 +168,11 @@
template <class Task>
void Serializer<Task>::dispatch(Task& task) {
- Mutex::ScopedUnlock u(lock);
// Preconditions: lock is held, state is EXECUTING or DISPATCHING
assert(state != IDLE);
assert(state != SHUTDOWN);
assert(state == EXECUTING || state == DISPATCHING);
+ Mutex::ScopedUnlock u(lock);
// No exceptions allowed in task.
try { task(); } catch (...) { assert(0); }
}