aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Hoa V. DINH <dinh.viet.hoa@gmail.com>2013-09-29 19:47:07 -0700
committerGravatar Hoa V. DINH <dinh.viet.hoa@gmail.com>2013-09-29 19:47:07 -0700
commit905b2415dae343af598d6f038e267d7f3af806f8 (patch)
treee929f517091355c6372f60e0139c28fbe5163220 /src
parentb3a1739618d12cceedd05e6eac81e1765d9e4223 (diff)
Callback is now called on the dispatch queue where the operation has been instanciated on Apple platforms
Diffstat (limited to 'src')
-rw-r--r--src/async/imap/MCIMAPOperation.cc7
-rw-r--r--src/core/basetypes/MCObject.cc16
-rw-r--r--src/core/basetypes/MCObject.h6
-rw-r--r--src/core/basetypes/MCOperation.cc14
-rw-r--r--src/core/basetypes/MCOperation.h12
-rw-r--r--src/core/basetypes/MCOperationQueue.cc17
-rw-r--r--src/core/basetypes/MCOperationQueue.h2
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);
};
}