aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar DINH Viet Hoa <hoa@sprw.me>2013-01-25 23:24:59 -0800
committerGravatar DINH Viet Hoa <hoa@sprw.me>2013-01-25 23:24:59 -0800
commitb6cc6334c57c4e2dd8daad01c14a3b24042f4a8b (patch)
tree912f96782256423e941c7d94c0bd7d3a3ebd725f
parentd70dc6e4830e6a9bb16d1bc1f8b83ebab409fd9d (diff)
fixed race condition in operation queue
-rw-r--r--src/core/basetypes/MCOperationQueue.cc23
-rw-r--r--src/core/basetypes/MCOperationQueue.h3
2 files changed, 15 insertions, 11 deletions
diff --git a/src/core/basetypes/MCOperationQueue.cc b/src/core/basetypes/MCOperationQueue.cc
index e7859122..d235fe91 100644
--- a/src/core/basetypes/MCOperationQueue.cc
+++ b/src/core/basetypes/MCOperationQueue.cc
@@ -55,7 +55,8 @@ void OperationQueue::runOperations()
while (true) {
Operation * op = NULL;
bool needsCheckRunning = false;
-
+ bool quitting;
+
AutoreleasePool * pool = new AutoreleasePool();
mailsem_down(mOperationSem);
@@ -64,9 +65,11 @@ void OperationQueue::runOperations()
if (mOperations->count() > 0) {
op = (Operation *) mOperations->objectAtIndex(0);
}
+ quitting = mQuitting;
pthread_mutex_unlock(&mLock);
- if (op == NULL) {
+ MCLog("quitting %i %p", mQuitting, op);
+ if ((op == NULL) && quitting) {
MCLog("stopping %p", this);
mailsem_up(mStopSem);
pool->release();
@@ -118,15 +121,14 @@ void OperationQueue::checkRunningAfterDelay(void * context)
{
bool quitting = false;
- //MCLog("started %i", mStarted);
- if (!mStarted)
- return;
-
pthread_mutex_lock(&mLock);
- if (mOperations->count() == 0) {
- MCLog("trying to quit %p", this);
- mailsem_up(mOperationSem);
- quitting = true;
+ if (!mQuitting) {
+ if (mOperations->count() == 0) {
+ MCLog("trying to quit %p", this);
+ mailsem_up(mOperationSem);
+ mQuitting = true;
+ quitting = true;
+ }
}
pthread_mutex_unlock(&mLock);
@@ -146,6 +148,7 @@ void OperationQueue::startThread()
if (mStarted)
return;
+ mQuitting = false;
mStarted = true;
pthread_create(&mThreadID, NULL, (void * (*)(void *)) OperationQueue::runOperationsOnThread, this);
mailsem_down(mStartSem);
diff --git a/src/core/basetypes/MCOperationQueue.h b/src/core/basetypes/MCOperationQueue.h
index d9f7e78f..dd503bb3 100644
--- a/src/core/basetypes/MCOperationQueue.h
+++ b/src/core/basetypes/MCOperationQueue.h
@@ -33,7 +33,8 @@ namespace mailcore {
pthread_mutex_t mLock;
bool mWaiting;
struct mailsem * mWaitingFinishedSem;
-
+ bool mQuitting;
+
void startThread();
static void runOperationsOnThread(OperationQueue * queue);
void runOperations();