From bff30540d86c77aacbc2c133c83aa7ccee823b48 Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Sat, 29 Jan 2011 11:25:56 -0500 Subject: new: Wrap adding and removing messages in atomic sections. This addresses atomicity of tag synchronization, the last atomicity problems in notmuch new. Each message add or remove is wrapped in its own atomic section, so interrupting notmuch new doesn't lose progress. --- notmuch-new.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'notmuch-new.c') diff --git a/notmuch-new.c b/notmuch-new.c index 598a2083..e79593cd 100644 --- a/notmuch-new.c +++ b/notmuch-new.c @@ -450,6 +450,12 @@ add_files_recursive (notmuch_database_t *notmuch, fflush (stdout); } + status = notmuch_database_begin_atomic (notmuch); + if (status) { + ret = status; + goto DONE; + } + status = notmuch_database_add_message (notmuch, next, &message); switch (status) { /* success */ @@ -490,6 +496,12 @@ add_files_recursive (notmuch_database_t *notmuch, goto DONE; } + status = notmuch_database_end_atomic (notmuch); + if (status) { + ret = status; + goto DONE; + } + if (message) { notmuch_message_destroy (message); message = NULL; @@ -728,6 +740,9 @@ remove_filename (notmuch_database_t *notmuch, { notmuch_status_t status; notmuch_message_t *message; + status = notmuch_database_begin_atomic (notmuch); + if (status) + return status; message = notmuch_database_find_message_by_filename (notmuch, path); status = notmuch_database_remove_message (notmuch, path); if (status == NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID) { @@ -737,6 +752,7 @@ remove_filename (notmuch_database_t *notmuch, } else add_files_state->removed_messages++; notmuch_message_destroy (message); + notmuch_database_end_atomic (notmuch); return status; } -- cgit v1.2.3