aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/basetypes/MCOperationQueue.cc38
-rw-r--r--src/core/basetypes/MCOperationQueue.h4
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);