diff options
-rw-r--r-- | src/async/imap/MCIMAPOperation.cc | 7 | ||||
-rw-r--r-- | src/core/basetypes/MCObject.cc | 16 | ||||
-rw-r--r-- | src/core/basetypes/MCObject.h | 6 | ||||
-rw-r--r-- | src/core/basetypes/MCOperation.cc | 14 | ||||
-rw-r--r-- | src/core/basetypes/MCOperation.h | 12 | ||||
-rw-r--r-- | src/core/basetypes/MCOperationQueue.cc | 17 | ||||
-rw-r--r-- | src/core/basetypes/MCOperationQueue.h | 2 |
7 files changed, 69 insertions, 5 deletions
diff --git a/src/async/imap/MCIMAPOperation.cc b/src/async/imap/MCIMAPOperation.cc index 1211a73b..99e4d6e0 100644 --- a/src/async/imap/MCIMAPOperation.cc +++ b/src/async/imap/MCIMAPOperation.cc @@ -9,6 +9,9 @@ #include "MCIMAPOperation.h" #include <stdlib.h> +#if __APPLE__ +#include <dispatch/dispatch.h> +#endif #include "MCIMAPAsyncSession.h" #include "MCIMAPSession.h" @@ -90,7 +93,7 @@ void IMAPOperation::bodyProgress(IMAPSession * session, unsigned int current, un context->current = current; context->maximum = maximum; retain(); - performMethodOnMainThread((Object::Method) &IMAPOperation::bodyProgressOnMainThread, context); + performMethodOnMainThread((Object::Method) &IMAPOperation::bodyProgressOnMainThread, context, true); } void IMAPOperation::bodyProgressOnMainThread(void * ctx) @@ -117,7 +120,7 @@ void IMAPOperation::itemsProgress(IMAPSession * session, unsigned int current, u context->current = current; context->maximum = maximum; retain(); - performMethodOnMainThread((Object::Method) &IMAPOperation::itemsProgressOnMainThread, context); + performMethodOnMainThread((Object::Method) &IMAPOperation::itemsProgressOnMainThread, context, true); } void IMAPOperation::itemsProgressOnMainThread(void * ctx) diff --git a/src/core/basetypes/MCObject.cc b/src/core/basetypes/MCObject.cc index e792a1fd..874e802d 100644 --- a/src/core/basetypes/MCObject.cc +++ b/src/core/basetypes/MCObject.cc @@ -205,6 +205,22 @@ void Object::performMethodOnMainThread(Method method, void * context, bool waitU } } +#if __APPLE__ +void Object::performMethodOnDispatchQueue(Method method, void * context, void * targetDispatchQueue, bool waitUntilDone) +{ + if (waitUntilDone) { + dispatch_sync((dispatch_queue_t) targetDispatchQueue, ^{ + (this->*method)(context); + }); + } + else { + dispatch_async((dispatch_queue_t) targetDispatchQueue, ^{ + (this->*method)(context); + }); + } +} +#endif + void Object::performMethodAfterDelay(Method method, void * context, double delay) { initDelayedPerform(); diff --git a/src/core/basetypes/MCObject.h b/src/core/basetypes/MCObject.h index 77f7e06e..faebdcec 100644 --- a/src/core/basetypes/MCObject.h +++ b/src/core/basetypes/MCObject.h @@ -3,6 +3,9 @@ #define __MAILCORE_MCOBJECT_H_ #include <pthread.h> +#if __APPLE__ +#include <dispatch/dispatch.h> +#endif #ifdef __cplusplus @@ -40,6 +43,9 @@ namespace mailcore { typedef void (Object::*Method) (void *); virtual void performMethod(Method method, void * context); virtual void performMethodOnMainThread(Method method, void * context, bool waitUntilDone = false); +#if __APPLE__ + virtual void performMethodOnDispatchQueue(Method method, void * context, void * targetDispatchQueue, bool waitUntilDone = false); +#endif virtual void performMethodAfterDelay(Method method, void * context, double delay); virtual void cancelDelayedPerformMethod(Method method, void * context); diff --git a/src/core/basetypes/MCOperation.cc b/src/core/basetypes/MCOperation.cc index 73a8d7cd..5829d739 100644 --- a/src/core/basetypes/MCOperation.cc +++ b/src/core/basetypes/MCOperation.cc @@ -7,6 +7,11 @@ Operation::Operation() mCallback = NULL; mCancelled = false; pthread_mutex_init(&mLock, NULL); +#if __APPLE__ + mCallbackDispatchQueue = dispatch_get_current_queue(); +#else + mCallbackDispatchQueue = NULL; +#endif } Operation::~Operation() @@ -56,3 +61,12 @@ void Operation::start() { } +void Operation::setCallbackDispatchQueue(dispatch_queue_t callbackDispatchQueue) +{ + mCallbackDispatchQueue = callbackDispatchQueue; +} + +dispatch_queue_t Operation::callbackDispatchQueue() +{ + return mCallbackDispatchQueue; +} diff --git a/src/core/basetypes/MCOperation.h b/src/core/basetypes/MCOperation.h index bb77dbb1..db0e5b35 100644 --- a/src/core/basetypes/MCOperation.h +++ b/src/core/basetypes/MCOperation.h @@ -5,6 +5,10 @@ #include <pthread.h> #include <MailCore/MCObject.h> +#if __APPLE__ +#include <dispatch/dispatch.h> +#endif + #ifdef __cplusplus namespace mailcore { @@ -32,10 +36,18 @@ namespace mailcore { virtual void start(); +#ifdef __APPLE__ + virtual void setCallbackDispatchQueue(dispatch_queue_t callbackDispatchQueue); + virtual dispatch_queue_t callbackDispatchQueue(); +#endif + private: OperationCallback * mCallback; bool mCancelled; pthread_mutex_t mLock; +#ifdef __APPLE__ + dispatch_queue_t mCallbackDispatchQueue; +#endif }; diff --git a/src/core/basetypes/MCOperationQueue.cc b/src/core/basetypes/MCOperationQueue.cc index c5270161..39d3bfbe 100644 --- a/src/core/basetypes/MCOperationQueue.cc +++ b/src/core/basetypes/MCOperationQueue.cc @@ -84,7 +84,7 @@ void OperationQueue::runOperations() break; } - performMethodOnMainThread((Object::Method) &OperationQueue::beforeMain, op, true); + performOnCallbackThread(op, (Object::Method) &OperationQueue::beforeMain, op, true); op->main(); @@ -101,7 +101,7 @@ void OperationQueue::runOperations() pthread_mutex_unlock(&mLock); if (!op->isCancelled()) { - performMethodOnMainThread((Object::Method) &OperationQueue::callbackOnMainThread, op, true); + performOnCallbackThread(op, (Object::Method) &OperationQueue::callbackOnMainThread, op, true); } if (needsCheckRunning) { @@ -115,6 +115,19 @@ void OperationQueue::runOperations() MCLog("cleanup thread %p", this); } +void OperationQueue::performOnCallbackThread(Operation * op, Method method, void * context, bool waitUntilDone) +{ +#if __APPLE__ + dispatch_queue_t queue = op->callbackDispatchQueue(); + if (queue == NULL) { + queue = dispatch_get_main_queue(); + } + performMethodOnDispatchQueue(method, context, op->callbackDispatchQueue(), waitUntilDone); +#else + performMethodOnMainThread(method, context, waitUntilDone); +#endif +} + void OperationQueue::beforeMain(Operation * op) { op->beforeMain(); diff --git a/src/core/basetypes/MCOperationQueue.h b/src/core/basetypes/MCOperationQueue.h index 0518d62f..cd61b249 100644 --- a/src/core/basetypes/MCOperationQueue.h +++ b/src/core/basetypes/MCOperationQueue.h @@ -48,7 +48,7 @@ namespace mailcore { void checkRunningOnMainThread(void * context); void checkRunningAfterDelay(void * context); void stoppedOnMainThread(void * context); - + void performOnCallbackThread(Operation * op, Method method, void * context, bool waitUntilDone); }; } |