aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/core/basetypes/MCOperationQueue.cc18
-rw-r--r--src/core/basetypes/MCOperationQueue.h1
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);
};