diff options
author | 2013-01-25 23:24:59 -0800 | |
---|---|---|
committer | 2013-01-25 23:24:59 -0800 | |
commit | b6cc6334c57c4e2dd8daad01c14a3b24042f4a8b (patch) | |
tree | 912f96782256423e941c7d94c0bd7d3a3ebd725f | |
parent | d70dc6e4830e6a9bb16d1bc1f8b83ebab409fd9d (diff) |
fixed race condition in operation queue
-rw-r--r-- | src/core/basetypes/MCOperationQueue.cc | 23 | ||||
-rw-r--r-- | src/core/basetypes/MCOperationQueue.h | 3 |
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(); |