ソースを参照

lock .uidvalidity on demand

a maildir re-scan doesn't need to lock it if it doesn't need to allocate
any new uids.
Oswald Buddenhagen 10 年 前
コミット
2eece82276
1 ファイル変更5 行追加8 行削除
  1. 5 8
      src/drv_maildir.c

+ 5 - 8
src/drv_maildir.c

@@ -590,6 +590,10 @@ lcktmr_timeout( void *aux )
 static int
 maildir_obtain_uid( maildir_store_t *ctx, int *uid )
 {
+	int ret;
+
+	if ((ret = maildir_uidval_lock( ctx )) != DRV_OK)
+		return ret;
 	*uid = ++ctx->nuid;
 	return maildir_store_uid( ctx );
 }
@@ -674,12 +678,6 @@ maildir_scan( maildir_store_t *ctx, msglist_t *msglist )
 	struct stat st;
 	char buf[_POSIX_PATH_MAX], nbuf[_POSIX_PATH_MAX];
 
-#ifdef USE_DB
-	if (!ctx->db)
-#endif /* USE_DB */
-		if ((ret = maildir_uidval_lock( ctx )) != DRV_OK)
-			return ret;
-
   again:
 	msglist->ents = 0;
 	msglist->nents = msglist->nalloc = 0;
@@ -1329,8 +1327,7 @@ maildir_store_msg( store_t *gctx, msg_data_t *data, int to_trash,
 		} else
 #endif /* USE_DB */
 		{
-			if ((ret = maildir_uidval_lock( ctx )) != DRV_OK ||
-			    (ret = maildir_obtain_uid( ctx, &uid )) != DRV_OK) {
+			if ((ret = maildir_obtain_uid( ctx, &uid )) != DRV_OK) {
 				free( data->data );
 				cb( ret, 0, aux );
 				return;