diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2017-11-25 13:19:44 +0100 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2018-07-20 18:27:32 +0200 |
commit | 683035a5fd4585ae8cfb30ed9acbcefd43fd0ba1 (patch) | |
tree | c0fa900bb72d6cd385ae08722a041790a9903f40 /src/tracker-store/tracker-events.c | |
parent | 0d8083510296dd2996a60a62a00579481c9aa7fb (diff) | |
download | tracker-683035a5fd4585ae8cfb30ed9acbcefd43fd0ba1.tar.gz |
tracker-store: Protect event batches with a mutex
While the pending data and event counter are only accessed by
the updates thread, the ready events will be potentially accessed
by both the updates and the dbus thread.
That said, chances of locking will be minimal, since the
get_pending() call only happens once a second (by default) or after
the pending buffer grew big enough.
Diffstat (limited to 'src/tracker-store/tracker-events.c')
-rw-r--r-- | src/tracker-store/tracker-events.c | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/src/tracker-store/tracker-events.c b/src/tracker-store/tracker-events.c index 05782b2c5..77de4c256 100644 --- a/src/tracker-store/tracker-events.c +++ b/src/tracker-store/tracker-events.c @@ -41,9 +41,13 @@ struct _TrackerEventBatch }; typedef struct { - guint total; - GHashTable *pending; + /* Accessed by updates/dbus threads */ + GMutex mutex; GHashTable *ready; + + /* Only accessed by updates thread */ + GHashTable *pending; + guint total; } EventsPrivate; static EventsPrivate *private; @@ -219,19 +223,11 @@ tracker_event_batch_merge (TrackerEventBatch *dest, } guint -tracker_events_get_total (gboolean and_reset) +tracker_events_get_total (void) { - guint total; - g_return_val_if_fail (private != NULL, 0); - total = private->total; - - if (and_reset) { - private->total = 0; - } - - return total; + return private->total; } static inline TrackerEventBatch * @@ -326,6 +322,8 @@ tracker_events_transact (void) if (!private->pending || g_hash_table_size (private->pending) == 0) return; + g_mutex_lock (&private->mutex); + if (!private->ready) { private->ready = tracker_event_batch_hashtable_new (); } @@ -349,6 +347,10 @@ tracker_events_transact (void) g_object_unref (rdf_type); } } + + private->total = 0; + + g_mutex_unlock (&private->mutex); } void @@ -370,6 +372,7 @@ void tracker_events_init (void) { private = g_new0 (EventsPrivate, 1); + g_mutex_init (&private->mutex); } void @@ -390,8 +393,10 @@ tracker_events_get_pending (void) g_return_val_if_fail (private != NULL, NULL); + g_mutex_lock (&private->mutex); pending = private->ready; private->ready = NULL; + g_mutex_unlock (&private->mutex); return pending; } |