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); }
 }


Reply via email to