aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/async/imap
diff options
context:
space:
mode:
authorGravatar Hoa V. DINH <dinh.viet.hoa@gmail.com>2014-03-21 21:55:31 -0700
committerGravatar Hoa V. DINH <dinh.viet.hoa@gmail.com>2014-03-21 21:55:39 -0700
commit51ed93a6e8ed71168e820d797d6dcfb7cb774ae5 (patch)
tree5d9759f91a8009fb927550761acc20df522af53f /src/async/imap
parent60f4e6e6d3f20b0a0ef342fba02538ad0c94c5a6 (diff)
Fixed #651: interrupt anyway even if IDLE is cancelled early
Diffstat (limited to 'src/async/imap')
-rw-r--r--src/async/imap/MCIMAPIdleOperation.cc12
-rw-r--r--src/async/imap/MCIMAPIdleOperation.h2
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();
};