changeset 1927:7ad1a47c615e HEAD

some more locking fixes
author Timo Sirainen <tss@iki.fi>
date Wed, 28 Apr 2004 22:16:23 +0300
parents 982bd89b42fd
children 5ca676060080
files src/lib-index/mail-index-lock.c src/lib-index/mail-index-sync-update.c src/lib-index/mail-transaction-log.c
diffstat 3 files changed, 10 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-index/mail-index-lock.c	Wed Apr 28 21:57:13 2004 +0300
+++ b/src/lib-index/mail-index-lock.c	Wed Apr 28 22:16:23 2004 +0300
@@ -230,8 +230,10 @@
 	if (fd == -1)
 		return -1;
 
-	if (index->lock_type == F_UNLCK)
-		(void)mail_index_lock_mprotect(index, F_RDLCK);
+	if (index->lock_type == F_UNLCK) {
+		if (mail_index_lock_mprotect(index, F_RDLCK) < 0)
+			return -1;
+	}
 
 	ret = write_full(fd, index->map->hdr, sizeof(*index->map->hdr));
 	if (ret < 0 || write_full(fd, index->map->records,
@@ -288,6 +290,7 @@
 		return -1;
 	}
 
+	(void)mail_index_lock_mprotect(index, F_WRLCK);
 	return 0;
 }
 
@@ -307,8 +310,10 @@
 	if (ret < 0)
 		return -1;
 
+	if (mail_index_lock_exclusive_copy(index) < 0)
+		return -1;
 	*lock_id_r = index->lock_id + 1;
-	return mail_index_lock_exclusive_copy(index);
+	return 0;
 }
 
 static int mail_index_copy_lock_finish(struct mail_index *index)
--- a/src/lib-index/mail-index-sync-update.c	Wed Apr 28 21:57:13 2004 +0300
+++ b/src/lib-index/mail-index-sync-update.c	Wed Apr 28 22:16:23 2004 +0300
@@ -220,6 +220,7 @@
 				map = mail_index_map_to_memory(map);
 				mail_index_unmap(index, index->map);
 				index->map = map;
+				index->hdr = map->hdr;
 				map->write_to_disk = TRUE;
 
 				dest_idx = rec.seq1-1;
--- a/src/lib-index/mail-transaction-log.c	Wed Apr 28 21:57:13 2004 +0300
+++ b/src/lib-index/mail-transaction-log.c	Wed Apr 28 22:16:23 2004 +0300
@@ -332,7 +332,6 @@
 			index->log_locked = FALSE;
 			return -1;
 		}
-		index->log_locked = FALSE;
 
 		ret = mail_index_map(index, FALSE);
 		if (ret > 0) {
@@ -347,6 +346,7 @@
 		}
 		hdr.file_seq = index->hdr->log_file_seq;
 		mail_index_unlock(index, lock_id);
+		index->log_locked = FALSE;
 
 		if (ret <= 0) {
 			(void)file_dotlock_delete(path, fd);