diff options
Diffstat (limited to 'src/tracker-store/tracker-writeback.c')
-rw-r--r-- | src/tracker-store/tracker-writeback.c | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/src/tracker-store/tracker-writeback.c b/src/tracker-store/tracker-writeback.c index a183b00a3..1edc3e2dd 100644 --- a/src/tracker-store/tracker-writeback.c +++ b/src/tracker-store/tracker-writeback.c @@ -27,8 +27,12 @@ #include "tracker-writeback.h" typedef struct { + /* Accessed by updates thread */ GHashTable *allowances; GHashTable *pending_events; + + /* Accessed by both updates and dbus threads */ + GMutex mutex; GHashTable *ready_events; } WritebackPrivate; @@ -115,9 +119,16 @@ tracker_writeback_reset_ready () GHashTable * tracker_writeback_get_ready (void) { + GHashTable *events; + g_return_val_if_fail (private != NULL, NULL); - return private->ready_events; + g_mutex_lock (&private->mutex); + events = private->ready_events; + private->ready_events = NULL; + g_mutex_unlock (&private->mutex); + + return events; } static void @@ -145,6 +156,7 @@ tracker_writeback_init (TrackerDataManager *data_manager, g_return_if_fail (private == NULL); private = g_new0 (WritebackPrivate, 1); + g_mutex_init (&private->mutex); private->allowances = g_hash_table_new_full (g_direct_hash, g_direct_equal, @@ -191,6 +203,8 @@ tracker_writeback_transact (void) if (!private->pending_events) return; + g_mutex_lock (&private->mutex); + if (!private->ready_events) { private->ready_events = g_hash_table_new_full (g_direct_hash, g_direct_equal, (GDestroyNotify) NULL, @@ -203,6 +217,8 @@ tracker_writeback_transact (void) g_hash_table_insert (private->ready_events, key, value); g_hash_table_iter_remove (&iter); } + + g_mutex_unlock (&private->mutex); } void @@ -214,7 +230,8 @@ tracker_writeback_shutdown (void) /* Perhaps hurry an emit of the ready events here? We're shutting down, * so I guess we're not required to do that here ... ? */ - tracker_writeback_reset_ready (); + g_clear_pointer (&private->ready_events, + (GDestroyNotify) g_hash_table_unref); free_private (private); private = NULL; |