Author: shuston
Date: Mon Nov 26 23:57:08 2012
New Revision: 1413945

URL: http://svn.apache.org/viewvc?rev=1413945&view=rev
Log:
Merge QPID-4424 fix to 0.20.

Modified:
    qpid/branches/0.20/qpid/cpp/src/qpid/sys/windows/PollableCondition.cpp   
(contents, props changed)

Modified: qpid/branches/0.20/qpid/cpp/src/qpid/sys/windows/PollableCondition.cpp
URL: 
http://svn.apache.org/viewvc/qpid/branches/0.20/qpid/cpp/src/qpid/sys/windows/PollableCondition.cpp?rev=1413945&r1=1413944&r2=1413945&view=diff
==============================================================================
--- qpid/branches/0.20/qpid/cpp/src/qpid/sys/windows/PollableCondition.cpp 
(original)
+++ qpid/branches/0.20/qpid/cpp/src/qpid/sys/windows/PollableCondition.cpp Mon 
Nov 26 23:57:08 2012
@@ -52,13 +52,14 @@ private:
     PollableCondition& parent;
     boost::shared_ptr<sys::Poller> poller;
     LONG isSet;
+    LONG isDispatching;
 };
 
 PollableConditionPrivate::PollableConditionPrivate(const 
sys::PollableCondition::Callback& cb,
                                                    sys::PollableCondition& 
parent,
                                                    const 
boost::shared_ptr<sys::Poller>& poller)
   : IOHandle(INVALID_SOCKET, boost::bind(&PollableConditionPrivate::dispatch, 
this, _1)),
-    cb(cb), parent(parent), poller(poller), isSet(0)
+    cb(cb), parent(parent), poller(poller), isSet(0), isDispatching(0)
 {
 }
 
@@ -77,7 +78,12 @@ void PollableConditionPrivate::poke()
 void PollableConditionPrivate::dispatch(windows::AsynchIoResult *result)
 {
     delete result;       // Poller::monitorHandle() allocates this
+    // If isDispatching is already set, just return. Else, enter.
+    if (::InterlockedCompareExchange(&isDispatching, 1, 0) == 1)
+        return;
     cb(parent);
+    LONG oops = ::InterlockedDecrement(&isDispatching);   // Result must be 0
+    assert(!oops);
     if (isSet)
         poke();
 }

Propchange: 
qpid/branches/0.20/qpid/cpp/src/qpid/sys/windows/PollableCondition.cpp
------------------------------------------------------------------------------
--- svn:mergeinfo (added)
+++ svn:mergeinfo Mon Nov 26 23:57:08 2012
@@ -0,0 +1,8 @@
+/qpid/branches/0.5.x-dev/qpid/cpp/src/qpid/sys/windows/PollableCondition.cpp:892761,894875
+/qpid/branches/0.6-release-windows-installer/cpp/src/qpid/sys/windows/PollableCondition.cpp:926803
+/qpid/branches/0.6-release-windows-installer/qpid/cpp/src/qpid/sys/windows/PollableCondition.cpp:926803,927233
+/qpid/branches/QPID-2519/cpp/src/qpid/sys/windows/PollableCondition.cpp:1072051-1079078
+/qpid/branches/java-network-refactor/qpid/cpp/src/qpid/sys/windows/PollableCondition.cpp:805429-825319
+/qpid/branches/qpid-2935/qpid/cpp/src/qpid/sys/windows/PollableCondition.cpp:1061302-1072333
+/qpid/branches/qpid-3346/qpid/cpp/src/qpid/sys/windows/PollableCondition.cpp:1144319-1179855
+/qpid/trunk/qpid/cpp/src/qpid/sys/windows/PollableCondition.cpp:1413889



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org
For additional commands, e-mail: commits-h...@qpid.apache.org

Reply via email to