From 81d1d0e5049979895ee8f8d04f879963b52b04ce Mon Sep 17 00:00:00 2001 From: Clemens Zeidler Date: Wed, 9 Feb 2011 22:11:50 +0000 Subject: [PATCH] To sync the mailbox a thread is started which reads the local files while in the parent thread the id list from the server is fetched. To sync both threads a BLocker was used. BLocker does not block when locked from the same thread so use a semaphore now. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@40412 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../imap/IMAPInboundProtocol.h | 1 + .../imap/imap_lib/IMAPStorage.cpp | 23 +++++++++++++++---- .../imap/imap_lib/IMAPStorage.h | 7 ++++-- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/add-ons/mail_daemon/inbound_protocols/imap/IMAPInboundProtocol.h b/src/add-ons/mail_daemon/inbound_protocols/imap/IMAPInboundProtocol.h index 2c8217c0f5..f907fc3e9e 100644 --- a/src/add-ons/mail_daemon/inbound_protocols/imap/IMAPInboundProtocol.h +++ b/src/add-ons/mail_daemon/inbound_protocols/imap/IMAPInboundProtocol.h @@ -10,6 +10,7 @@ #include "MailProtocol.h" #include +#include #include #include "MailSettings.h" diff --git a/src/add-ons/mail_daemon/inbound_protocols/imap/imap_lib/IMAPStorage.cpp b/src/add-ons/mail_daemon/inbound_protocols/imap/imap_lib/IMAPStorage.cpp index a8ead88cd2..540f880ecf 100644 --- a/src/add-ons/mail_daemon/inbound_protocols/imap/imap_lib/IMAPStorage.cpp +++ b/src/add-ons/mail_daemon/inbound_protocols/imap/imap_lib/IMAPStorage.cpp @@ -40,6 +40,7 @@ IMAPMailboxSync::Sync(IMAPStorage& storage, IMAPMailbox& mailbox) found = true; if (mailEntry.flags != minMessage.flags) storage.SetFlags(mailEntry.uid, minMessage.flags); + break; } } if (!found) @@ -109,6 +110,18 @@ ReadDirThreadFunction(void *data) } +IMAPStorage::IMAPStorage() +{ + fLoadDatabaseLock = create_sem(1, "sync lock"); +} + + +IMAPStorage::~IMAPStorage() +{ + delete_sem(fLoadDatabaseLock); +} + + void IMAPStorage::SetTo(const char* dir) { @@ -129,10 +142,10 @@ IMAPStorage::StartReadDatabase() return id; // will be unlocked from thread - fLoadDatabaseLock.Lock(); + acquire_sem(fLoadDatabaseLock); status = resume_thread(id); if (status != B_OK) - fLoadDatabaseLock.Unlock(); + release_sem(fLoadDatabaseLock); return status; } @@ -141,9 +154,9 @@ status_t IMAPStorage::WaitForDatabaseReaded() { // just wait for thread - if (!fLoadDatabaseLock.Lock()) + if (acquire_sem(fLoadDatabaseLock) != B_OK) return B_ERROR; - fLoadDatabaseLock.Unlock(); + release_sem(fLoadDatabaseLock); return B_OK; } @@ -440,7 +453,7 @@ IMAPStorage::_ReadFilesThread() fMailEntryMap[entry.uid] = entry; } - fLoadDatabaseLock.Unlock(); + release_sem(fLoadDatabaseLock); return B_OK; } diff --git a/src/add-ons/mail_daemon/inbound_protocols/imap/imap_lib/IMAPStorage.h b/src/add-ons/mail_daemon/inbound_protocols/imap/imap_lib/IMAPStorage.h index 40357767ff..dead7e9102 100644 --- a/src/add-ons/mail_daemon/inbound_protocols/imap/imap_lib/IMAPStorage.h +++ b/src/add-ons/mail_daemon/inbound_protocols/imap/imap_lib/IMAPStorage.h @@ -12,7 +12,7 @@ #include #include -#include +#include #include #include @@ -46,6 +46,9 @@ public: kBodyDownloaded = 0x02 }; + IMAPStorage(); + ~IMAPStorage(); + void SetTo(const char* dir); status_t StartReadDatabase(); @@ -88,7 +91,7 @@ private: BPath fMailboxPath; - BLocker fLoadDatabaseLock; + sem_id fLoadDatabaseLock; MailEntryMap fMailEntryMap; };