diff options
-rwxr-xr-x | src/async/imap/MCIMAPAsyncConnection.cc | 12 | ||||
-rw-r--r-- | src/core/basetypes/MCLog.c | 20 | ||||
-rw-r--r-- | src/core/basetypes/MCLog.h | 3 | ||||
-rw-r--r-- | src/core/basetypes/MCObject.cc | 10 |
4 files changed, 38 insertions, 7 deletions
diff --git a/src/async/imap/MCIMAPAsyncConnection.cc b/src/async/imap/MCIMAPAsyncConnection.cc index 738da0d1..0cf658c2 100755 --- a/src/async/imap/MCIMAPAsyncConnection.cc +++ b/src/async/imap/MCIMAPAsyncConnection.cc @@ -110,7 +110,7 @@ IMAPAsyncConnection::IMAPAsyncConnection() IMAPAsyncConnection::~IMAPAsyncConnection() { - cancelDelayedPerformMethod((Object::Method) &IMAPAsyncConnection::tryAutomaticDisconnectAfterDelay, NULL); + cancelDelayedPerformMethodOnDispatchQueue((Object::Method) &IMAPAsyncConnection::tryAutomaticDisconnectAfterDelay, NULL, dispatchQueue()); pthread_mutex_destroy(&mConnectionLoggerLock); MC_SAFE_RELEASE(mInternalLogger); MC_SAFE_RELEASE(mQueueCallback); @@ -554,7 +554,11 @@ unsigned int IMAPAsyncConnection::operationsCount() void IMAPAsyncConnection::runOperation(IMAPOperation * operation) { - cancelDelayedPerformMethod((Object::Method) &IMAPAsyncConnection::tryAutomaticDisconnectAfterDelay, NULL); + if (mScheduledAutomaticDisconnect) { + cancelDelayedPerformMethodOnDispatchQueue((Object::Method) &IMAPAsyncConnection::tryAutomaticDisconnectAfterDelay, NULL, dispatchQueue()); + mOwner->release(); + mScheduledAutomaticDisconnect = false; + } mQueue->addOperation(operation); } @@ -567,12 +571,12 @@ void IMAPAsyncConnection::tryAutomaticDisconnect() bool scheduledAutomaticDisconnect = mScheduledAutomaticDisconnect; if (scheduledAutomaticDisconnect) { - cancelDelayedPerformMethod((Object::Method) &IMAPAsyncConnection::tryAutomaticDisconnectAfterDelay, NULL); + cancelDelayedPerformMethodOnDispatchQueue((Object::Method) &IMAPAsyncConnection::tryAutomaticDisconnectAfterDelay, NULL, dispatchQueue()); } mOwner->retain(); mScheduledAutomaticDisconnect = true; - performMethodAfterDelay((Object::Method) &IMAPAsyncConnection::tryAutomaticDisconnectAfterDelay, NULL, 30); + performMethodOnDispatchQueueAfterDelay((Object::Method) &IMAPAsyncConnection::tryAutomaticDisconnectAfterDelay, NULL, dispatchQueue(), 15); if (scheduledAutomaticDisconnect) { mOwner->release(); diff --git a/src/core/basetypes/MCLog.c b/src/core/basetypes/MCLog.c index 3e91a349..4d01b284 100644 --- a/src/core/basetypes/MCLog.c +++ b/src/core/basetypes/MCLog.c @@ -7,6 +7,9 @@ #include <sys/time.h> #include <pthread.h> #include <unistd.h> +#if __APPLE__ +#include <execinfo.h> +#endif static pid_t sPid = -1; int MCLogEnabled = 0; @@ -77,4 +80,21 @@ static void logInternalv(FILE * file, } vfprintf(file, format, argp); fprintf(file, "\n"); + + if (dumpStack) { +#if __APPLE__ + void * frame[128]; + int frameCount; + int i; + + fprintf(file, " "); + frameCount = backtrace(frame, 128); + for(i = 0 ; i < frameCount ; i ++) { + fprintf(file, " %p", frame[i]); + } + fprintf(file, "\n"); +#endif + // TODO: other platforms implemented needed. + } + } diff --git a/src/core/basetypes/MCLog.h b/src/core/basetypes/MCLog.h index 21a24509..95e227e7 100644 --- a/src/core/basetypes/MCLog.h +++ b/src/core/basetypes/MCLog.h @@ -5,7 +5,8 @@ #include <stdio.h> #define MCLog(...) MCLogInternal(NULL, __FILE__, __LINE__, 0, __VA_ARGS__) - +#define MCLogStack(...) MCLogInternal(NULL, __FILE__, __LINE__, 1, __VA_ARGS__) + extern int MCLogEnabled; #ifndef __printflike diff --git a/src/core/basetypes/MCObject.cc b/src/core/basetypes/MCObject.cc index 4701ea52..26b59e67 100644 --- a/src/core/basetypes/MCObject.cc +++ b/src/core/basetypes/MCObject.cc @@ -154,6 +154,7 @@ static void removeFromPerformHash(Object * obj, Object::Method method, void * co #if __APPLE__ queueIdentifier = (String *) dispatch_queue_get_specific((dispatch_queue_t) targetDispatchQueue, "MCDispatchQueueID"); #endif + memset(&keyData, 0, sizeof(keyData)); keyData.dispatchQueueIdentifier = queueIdentifier; keyData.obj = obj; keyData.context = context; @@ -184,6 +185,7 @@ static void addToPerformHash(Object * obj, Object::Method method, void * context dispatch_queue_set_specific((dispatch_queue_t) targetDispatchQueue, "MCDispatchQueueID", queueIdentifier, queueIdentifierDestructor); } #endif + memset(&keyData, 0, sizeof(keyData)); keyData.dispatchQueueIdentifier = queueIdentifier; keyData.obj = obj; keyData.context = context; @@ -209,6 +211,7 @@ static void * getFromPerformHash(Object * obj, Object::Method method, void * con if (queueIdentifier == NULL) return NULL; #endif + memset(&keyData, 0, sizeof(keyData)); keyData.dispatchQueueIdentifier = queueIdentifier; keyData.obj = obj; keyData.context = context; @@ -318,7 +321,9 @@ void Object::performMethodOnDispatchQueueAfterDelay(Method method, void * contex addToPerformHash(this, method, context, targetDispatchQueue, (void *) dupCancelableBlock); dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC)); dispatch_after(popTime, (dispatch_queue_t) targetDispatchQueue, ^(void) { - removeFromPerformHash(this, method, context, targetDispatchQueue); + if (!cancelled) { + removeFromPerformHash(this, method, context, targetDispatchQueue); + } dupCancelableBlock(false); Block_release(dupCancelableBlock); release(); @@ -329,8 +334,9 @@ void Object::cancelDelayedPerformMethodOnDispatchQueue(Method method, void * con { initDelayedPerform(); void (^dupCancelableBlock)(bool cancel) = (void (^)(bool)) getFromPerformHash(this, method, context, targetDispatchQueue); - if (dupCancelableBlock == NULL) + if (dupCancelableBlock == NULL) { return; + } removeFromPerformHash(this, method, context, targetDispatchQueue); dupCancelableBlock(true); } |