diff -up evolution-data-server-3.8.5/camel/camel-db.c.cameldb-track-pending-syncs evolution-data-server-3.8.5/camel/camel-db.c --- evolution-data-server-3.8.5/camel/camel-db.c.cameldb-track-pending-syncs 2013-08-11 00:00:52.000000000 +0200 +++ evolution-data-server-3.8.5/camel/camel-db.c 2014-12-05 08:55:12.403985638 +0100 @@ -55,6 +55,12 @@ typedef struct { GRecMutex sync_mutex; guint timeout_id; gint flags; + + /* Do know how many syncs are pending, to not close + the file before the last sync is over */ + guint pending_syncs; + GMutex pending_syncs_lock; + GCond pending_syncs_cond; } CamelSqlite3File; static gint @@ -93,6 +99,13 @@ sync_request_thread_cb (gpointer task_da call_old_file_Sync (sync_data->cFile, sync_data->flags); + g_mutex_lock (&sync_data->cFile->pending_syncs_lock); + g_warn_if_fail (sync_data->cFile->pending_syncs > 0); + sync_data->cFile->pending_syncs--; + if (!sync_data->cFile->pending_syncs) + g_cond_signal (&sync_data->cFile->pending_syncs_cond); + g_mutex_unlock (&sync_data->cFile->pending_syncs_lock); + done = sync_data->done; g_free (sync_data); @@ -138,6 +151,10 @@ sync_push_request (CamelSqlite3File *cFi cFile->flags = 0; + g_mutex_lock (&cFile->pending_syncs_lock); + cFile->pending_syncs++; + g_mutex_unlock (&cFile->pending_syncs_lock); + g_rec_mutex_unlock (&cFile->sync_mutex); g_thread_pool_push (sync_pool, data, &error); @@ -251,6 +268,12 @@ camel_sqlite3_file_xClose (sqlite3_file /* Make the last sync. */ sync_push_request (cFile, TRUE); + g_mutex_lock (&cFile->pending_syncs_lock); + while (cFile->pending_syncs > 0) { + g_cond_wait (&cFile->pending_syncs_cond, &cFile->pending_syncs_lock); + } + g_mutex_unlock (&cFile->pending_syncs_lock); + if (cFile->old_vfs_file->pMethods) res = cFile->old_vfs_file->pMethods->xClose (cFile->old_vfs_file); else @@ -260,6 +283,8 @@ camel_sqlite3_file_xClose (sqlite3_file cFile->old_vfs_file = NULL; g_rec_mutex_clear (&cFile->sync_mutex); + g_mutex_clear (&cFile->pending_syncs_lock); + g_cond_clear (&cFile->pending_syncs_cond); return res; } @@ -319,6 +344,10 @@ camel_sqlite3_vfs_xOpen (sqlite3_vfs *pV } g_rec_mutex_init (&cFile->sync_mutex); + g_mutex_init (&cFile->pending_syncs_lock); + g_cond_init (&cFile->pending_syncs_cond); + + cFile->pending_syncs = 0; g_rec_mutex_lock (&only_once_lock);