changeset 2724:0b4d8354737a HEAD

Don't lock/unlock mbox separately for each message. Drop the lock only at the end of the transaction.
author Timo Sirainen <tss@iki.fi>
date Sun, 10 Oct 2004 20:44:54 +0300
parents 12b503fbb8af
children ccd07e584938
files src/lib-storage/index/index-storage.h src/lib-storage/index/mbox/mbox-mail.c src/lib-storage/index/mbox/mbox-storage.c src/lib-storage/index/mbox/mbox-transaction.c
diffstat 4 files changed, 12 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/index/index-storage.h	Sun Oct 10 20:25:44 2004 +0300
+++ b/src/lib-storage/index/index-storage.h	Sun Oct 10 20:44:54 2004 +0300
@@ -78,7 +78,7 @@
 	ino_t mbox_ino;
 	unsigned int mbox_excl_locks, mbox_shared_locks;
 	struct dotlock mbox_dotlock;
-	unsigned int mbox_lock_id, mbox_mail_lock_id;
+	unsigned int mbox_lock_id;
 	int mbox_readonly;
 	time_t mbox_dirty_stamp;
 	off_t mbox_dirty_size;
--- a/src/lib-storage/index/mbox/mbox-mail.c	Sun Oct 10 20:25:44 2004 +0300
+++ b/src/lib-storage/index/mbox/mbox-mail.c	Sun Oct 10 20:44:54 2004 +0300
@@ -16,6 +16,8 @@
 
 static int mbox_mail_seek(struct index_mail *mail)
 {
+	struct mbox_transaction_context *t =
+		(struct mbox_transaction_context *)mail->trans;
 	struct index_mailbox *ibox = mail->ibox;
 	enum mbox_sync_flags sync_flags = 0;
 	int ret, deleted;
@@ -30,7 +32,7 @@
 			return -1;
 
 		i_assert(ibox->mbox_lock_type != F_UNLCK);
-		ibox->mbox_mail_lock_id = ibox->mbox_lock_id;
+		t->mbox_lock_id = ibox->mbox_lock_id;
 	}
 
 	if (mbox_file_open_stream(ibox) < 0)
@@ -49,8 +51,8 @@
 	if (ret == 0) {
 		/* we'll need to re-sync it completely */
 		if (ibox->mbox_lock_type == F_RDLCK) {
-			if (ibox->mbox_mail_lock_id == ibox->mbox_lock_id)
-                                ibox->mbox_mail_lock_id = 0;
+			if (ibox->mbox_lock_id == t->mbox_lock_id)
+				t->mbox_lock_id = 0;
 			(void)mbox_unlock(mail->ibox, ibox->mbox_lock_id);
 			ibox->mbox_lock_id = 0;
 			i_assert(ibox->mbox_lock_type == F_UNLCK);
--- a/src/lib-storage/index/mbox/mbox-storage.c	Sun Oct 10 20:25:44 2004 +0300
+++ b/src/lib-storage/index/mbox/mbox-storage.c	Sun Oct 10 20:44:54 2004 +0300
@@ -365,14 +365,6 @@
 	return t_strconcat(storage->dir, "/", name, NULL);
 }
 
-static void mbox_mail_deinit(struct index_mail *mail)
-{
-	if (mail->ibox->mbox_mail_lock_id != 0) {
-		(void)mbox_unlock(mail->ibox, mail->ibox->mbox_mail_lock_id);
-                mail->ibox->mbox_mail_lock_id = 0;
-	}
-}
-
 static int mbox_mail_is_recent(struct index_mailbox *ibox __attr_unused__,
 			       uint32_t uid __attr_unused__)
 {
@@ -416,7 +408,6 @@
 	ibox->mbox_lock_type = F_UNLCK;
 	ibox->mbox_ext_idx = mbox_ext_idx;
 
-	ibox->mail_deinit = mbox_mail_deinit;
 	ibox->is_recent = mbox_mail_is_recent;
 	ibox->mail_interface = &mbox_mail;
         ibox->mbox_do_dirty_syncs = getenv("MBOX_DIRTY_SYNCS") != NULL;
--- a/src/lib-storage/index/mbox/mbox-transaction.c	Sun Oct 10 20:25:44 2004 +0300
+++ b/src/lib-storage/index/mbox/mbox-transaction.c	Sun Oct 10 20:44:54 2004 +0300
@@ -37,6 +37,12 @@
 	}
 	t = NULL;
 
+	if (lock_id != 0 && ibox->mbox_lock_type != F_WRLCK) {
+		/* unlock before writing any changes */
+		(void)mbox_unlock(ibox, lock_id);
+		lock_id = 0;
+	}
+
 	if (ret == 0) {
 		enum mbox_sync_flags mbox_sync_flags = MBOX_SYNC_LAST_COMMIT;
 		if ((flags & MAILBOX_SYNC_FLAG_FULL_READ) != 0)