aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rwxr-xr-xsrc/async/imap/MCIMAPAsyncConnection.cc12
-rw-r--r--src/core/basetypes/MCLog.c20
-rw-r--r--src/core/basetypes/MCLog.h3
-rw-r--r--src/core/basetypes/MCObject.cc10
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);
}