diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/core/basetypes/MCOperationQueue.cc | 38 | ||||
-rw-r--r-- | src/core/basetypes/MCOperationQueue.h | 4 |
2 files changed, 20 insertions, 22 deletions
diff --git a/src/core/basetypes/MCOperationQueue.cc b/src/core/basetypes/MCOperationQueue.cc index 5309b111..2e7eaf86 100644 --- a/src/core/basetypes/MCOperationQueue.cc +++ b/src/core/basetypes/MCOperationQueue.cc @@ -8,6 +8,7 @@ #include "MCLog.h" #include "MCAutoreleasePool.h" #include <libetpan/libetpan.h> +#include <thread> using namespace mailcore; @@ -15,7 +16,6 @@ OperationQueue::OperationQueue() { mOperations = new Array(); mStarted = false; - pthread_mutex_init(&mLock, NULL); mWaiting = false; mOperationSem = mailsem_new(); mStartSem = mailsem_new(); @@ -26,7 +26,6 @@ OperationQueue::OperationQueue() OperationQueue::~OperationQueue() { MC_SAFE_RELEASE(mOperations); - pthread_mutex_destroy(&mLock); mailsem_free(mOperationSem); mailsem_free(mStartSem); mailsem_free(mStopSem); @@ -35,18 +34,13 @@ OperationQueue::~OperationQueue() void OperationQueue::addOperation(Operation * op) { - pthread_mutex_lock(&mLock); + mLock.lock(); mOperations->addObject(op); - pthread_mutex_unlock(&mLock); + mLock.unlock(); mailsem_up(mOperationSem); startThread(); } -void OperationQueue::runOperationsOnThread(OperationQueue * queue) -{ - queue->runOperations(); -} - void OperationQueue::runOperations() { MCLog("start thread"); @@ -61,12 +55,12 @@ void OperationQueue::runOperations() mailsem_down(mOperationSem); - pthread_mutex_lock(&mLock); + mLock.lock(); if (mOperations->count() > 0) { op = (Operation *) mOperations->objectAtIndex(0); } quitting = mQuitting; - pthread_mutex_unlock(&mLock); + mLock.unlock(); MCLog("quitting %i %p", mQuitting, op); if ((op == NULL) && quitting) { @@ -80,7 +74,7 @@ void OperationQueue::runOperations() op->retain()->autorelease(); - pthread_mutex_lock(&mLock); + mLock.lock(); mOperations->removeObjectAtIndex(0); if (mOperations->count() == 0) { if (mWaiting) { @@ -88,7 +82,7 @@ void OperationQueue::runOperations() } needsCheckRunning = true; } - pthread_mutex_unlock(&mLock); + mLock.unlock(); if (!op->isCancelled()) { if (op->callback() != NULL) { @@ -123,7 +117,7 @@ void OperationQueue::checkRunningAfterDelay(void * context) { bool quitting = false; - pthread_mutex_lock(&mLock); + mLock.lock(); if (!mQuitting) { if (mOperations->count() == 0) { MCLog("trying to quit %p", this); @@ -132,7 +126,7 @@ void OperationQueue::checkRunningAfterDelay(void * context) quitting = true; } } - pthread_mutex_unlock(&mLock); + mLock.unlock(); // Number of operations can't be changed because it runs on main thread. // And addOperation() should also be called from main thread. @@ -152,7 +146,11 @@ void OperationQueue::startThread() mQuitting = false; mStarted = true; - pthread_create(&mThreadID, NULL, (void * (*)(void *)) OperationQueue::runOperationsOnThread, this); + std::thread t([=]() + { + runOperations(); + }); + t.detach(); mailsem_down(mStartSem); } @@ -160,9 +158,9 @@ unsigned int OperationQueue::count() { unsigned int count; - pthread_mutex_lock(&mLock); + mLock.lock(); count = mOperations->count(); - pthread_mutex_unlock(&mLock); + mLock.unlock(); return count; } @@ -172,12 +170,12 @@ void OperationQueue::waitUntilAllOperationsAreFinished() { bool waiting = false; - pthread_mutex_lock(&mLock); + mLock.lock(); if (mOperations->count() > 0) { mWaiting = true; waiting = true; } - pthread_mutex_unlock(&mLock); + mLock.unlock(); if (waiting) { sem_wait(&mWaitingFinishedSem); diff --git a/src/core/basetypes/MCOperationQueue.h b/src/core/basetypes/MCOperationQueue.h index dd503bb3..bb862e72 100644 --- a/src/core/basetypes/MCOperationQueue.h +++ b/src/core/basetypes/MCOperationQueue.h @@ -6,6 +6,7 @@ #include <semaphore.h> #include <mailcore/MCObject.h> #include <libetpan/libetpan.h> +#include <mutex> #ifdef __cplusplus @@ -30,13 +31,12 @@ namespace mailcore { struct mailsem * mOperationSem; struct mailsem * mStartSem; struct mailsem * mStopSem; - pthread_mutex_t mLock; + std::mutex mLock; bool mWaiting; struct mailsem * mWaitingFinishedSem; bool mQuitting; void startThread(); - static void runOperationsOnThread(OperationQueue * queue); void runOperations(); void callbackOnMainThread(Operation * op); void checkRunningOnMainThread(void * context); |