aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core
diff options
context:
space:
mode:
authorGravatar Hoa V. DINH <dinh.viet.hoa@gmail.com>2014-02-28 10:38:15 -0800
committerGravatar Hoa V. DINH <dinh.viet.hoa@gmail.com>2014-02-28 10:38:15 -0800
commit3c294cdebce8d22f043720ee8afa2f6362e24b1b (patch)
treee8c76fb373ee8e0d86216cdc89f6ea7b6e61db74 /src/core
parentef0724e96c23bb49c9dfee34db4d6dcc6f37dc99 (diff)
Fixed #615: fixed issue with cancelling "perform after delay"
Diffstat (limited to 'src/core')
-rw-r--r--src/core/basetypes/MCLog.c20
-rw-r--r--src/core/basetypes/MCLog.h3
-rw-r--r--src/core/basetypes/MCObject.cc10
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);
}