diff options
author | 2014-02-28 10:38:15 -0800 | |
---|---|---|
committer | 2014-02-28 10:38:15 -0800 | |
commit | 3c294cdebce8d22f043720ee8afa2f6362e24b1b (patch) | |
tree | e8c76fb373ee8e0d86216cdc89f6ea7b6e61db74 /src/core | |
parent | ef0724e96c23bb49c9dfee34db4d6dcc6f37dc99 (diff) |
Fixed #615: fixed issue with cancelling "perform after delay"
Diffstat (limited to 'src/core')
-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 |
3 files changed, 30 insertions, 3 deletions
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); } |