diff options
-rw-r--r-- | src/core/basetypes/MCOperationQueue.cc | 18 | ||||
-rw-r--r-- | src/core/basetypes/MCOperationQueue.h | 1 |
2 files changed, 14 insertions, 5 deletions
diff --git a/src/core/basetypes/MCOperationQueue.cc b/src/core/basetypes/MCOperationQueue.cc index 4afdd112..8dd7a4f1 100644 --- a/src/core/basetypes/MCOperationQueue.cc +++ b/src/core/basetypes/MCOperationQueue.cc @@ -72,6 +72,10 @@ void OperationQueue::runOperations() if ((op == NULL) && quitting) { MCLog("stopping %p", this); mailsem_up(mStopSem); + + retain(); // (2) + performMethodOnMainThread((Object::Method) &OperationQueue::stoppedOnMainThread, NULL, true); + pool->release(); break; } @@ -140,14 +144,18 @@ void OperationQueue::checkRunningAfterDelay(void * context) // Number of operations can't be changed because it runs on main thread. // And addOperation() should also be called from main thread. - if (quitting) { - mailsem_down(mStopSem); - mStarted = false; - } - release(); // (1) } +void OperationQueue::stoppedOnMainThread(void * context) +{ + MCLog("thread stopped %p", this); + mailsem_down(mStopSem); + mStarted = false; + + release(); // (2) +} + void OperationQueue::startThread() { if (mStarted) diff --git a/src/core/basetypes/MCOperationQueue.h b/src/core/basetypes/MCOperationQueue.h index 92f2de48..b9323dea 100644 --- a/src/core/basetypes/MCOperationQueue.h +++ b/src/core/basetypes/MCOperationQueue.h @@ -41,6 +41,7 @@ namespace mailcore { void callbackOnMainThread(Operation * op); void checkRunningOnMainThread(void * context); void checkRunningAfterDelay(void * context); + void stoppedOnMainThread(void * context); }; |