diff options
author | Hoa V. DINH <dinh.viet.hoa@gmail.com> | 2014-03-21 21:55:31 -0700 |
---|---|---|
committer | Hoa V. DINH <dinh.viet.hoa@gmail.com> | 2014-03-21 21:55:39 -0700 |
commit | 51ed93a6e8ed71168e820d797d6dcfb7cb774ae5 (patch) | |
tree | 5d9759f91a8009fb927550761acc20df522af53f /src/async/imap | |
parent | 60f4e6e6d3f20b0a0ef342fba02538ad0c94c5a6 (diff) |
Fixed #651: interrupt anyway even if IDLE is cancelled early
Diffstat (limited to 'src/async/imap')
-rw-r--r-- | src/async/imap/MCIMAPIdleOperation.cc | 12 | ||||
-rw-r--r-- | src/async/imap/MCIMAPIdleOperation.h | 2 |
2 files changed, 14 insertions, 0 deletions
diff --git a/src/async/imap/MCIMAPIdleOperation.cc b/src/async/imap/MCIMAPIdleOperation.cc index b0530bfa..803c270f 100644 --- a/src/async/imap/MCIMAPIdleOperation.cc +++ b/src/async/imap/MCIMAPIdleOperation.cc @@ -17,10 +17,12 @@ IMAPIdleOperation::IMAPIdleOperation() { mLastKnownUid = 0; mSetupSuccess = false; + pthread_mutex_init(&mLock, NULL); } IMAPIdleOperation::~IMAPIdleOperation() { + pthread_mutex_destroy(&mLock); } void IMAPIdleOperation::setLastKnownUID(uint32_t uid) @@ -47,6 +49,13 @@ void IMAPIdleOperation::unprepare() void IMAPIdleOperation::main() { + pthread_mutex_lock(&mLock); + bool interrupted = mInterrupted; + pthread_mutex_unlock(&mLock); + if (interrupted) { + return; + } + ErrorCode error; session()->session()->selectIfNeeded(folder(), &error); if (error != ErrorNone) { @@ -68,6 +77,9 @@ void IMAPIdleOperation::main() void IMAPIdleOperation::interruptIdle() { + pthread_mutex_lock(&mLock); + mInterrupted = true; + pthread_mutex_unlock(&mLock); if (mSetupSuccess) { session()->session()->interruptIdle(); } diff --git a/src/async/imap/MCIMAPIdleOperation.h b/src/async/imap/MCIMAPIdleOperation.h index b91e2681..87ed14d8 100644 --- a/src/async/imap/MCIMAPIdleOperation.h +++ b/src/async/imap/MCIMAPIdleOperation.h @@ -32,6 +32,8 @@ namespace mailcore { private: uint32_t mLastKnownUid; bool mSetupSuccess; + bool mInterrupted; + pthread_mutex_t mLock; void prepare(); void unprepare(); }; |