summaryrefslogtreecommitdiff
path: root/src/tracker-store/tracker-writeback.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tracker-store/tracker-writeback.c')
-rw-r--r--src/tracker-store/tracker-writeback.c21
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;