aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Hoa V. DINH <dinh.viet.hoa@gmail.com>2013-06-11 20:33:43 -0700
committerGravatar Hoa V. Dinh <dvh@google.com>2013-06-14 13:49:30 -0700
commitd05199011feb82312749db9e231191dad62bcfac (patch)
treed295773d5f152eefeca2ef98851567f963421b06
parent9bf597f7b543be442eb8c641f8d9e7f5453ecafd (diff)
Fixed deadlock in OperationQueue
-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);
};