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 | |
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.
-rw-r--r-- | src/tracker-store/tracker-events.c | 29 | ||||
-rw-r--r-- | src/tracker-store/tracker-events.h | 2 | ||||
-rw-r--r-- | src/tracker-store/tracker-events.vapi | 2 | ||||
-rw-r--r-- | src/tracker-store/tracker-resources.vala | 5 |
4 files changed, 20 insertions, 18 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; } diff --git a/src/tracker-store/tracker-events.h b/src/tracker-store/tracker-events.h index 4d6ff4e1e..1aea15ab6 100644 --- a/src/tracker-store/tracker-events.h +++ b/src/tracker-store/tracker-events.h @@ -52,7 +52,7 @@ void tracker_events_add_delete (gint graph_id, gint object_id, const gchar *object, GPtrArray *rdf_types); -guint tracker_events_get_total (gboolean and_reset); +guint tracker_events_get_total (void); void tracker_events_reset_pending (void); void tracker_events_transact (void); diff --git a/src/tracker-store/tracker-events.vapi b/src/tracker-store/tracker-events.vapi index da47267b9..16df92e84 100644 --- a/src/tracker-store/tracker-events.vapi +++ b/src/tracker-store/tracker-events.vapi @@ -24,7 +24,7 @@ namespace Tracker { public void shutdown (); public void add_insert (int graph_id, int subject_id, string subject, int pred_id, int object_id, string object, GLib.PtrArray rdf_types); public void add_delete (int graph_id, int subject_id, string subject, int pred_id, int object_id, string object, GLib.PtrArray rdf_types); - public uint get_total (bool and_reset); + public uint get_total (); public void reset_pending (); public void transact (); diff --git a/src/tracker-store/tracker-resources.vala b/src/tracker-store/tracker-resources.vala index 0635b4f23..9d9b83c18 100644 --- a/src/tracker-store/tracker-resources.vala +++ b/src/tracker-store/tracker-resources.vala @@ -236,9 +236,6 @@ public class Tracker.Resources : Object { } } - /* Reset counter */ - Tracker.Events.get_total (true); - /* Writeback feature */ var writebacks = Tracker.Writeback.get_ready (); @@ -289,7 +286,7 @@ public class Tracker.Resources : Object { void check_graph_updated_signal () { /* Check for whether we need an immediate emit */ - if (Tracker.Events.get_total (false) > GRAPH_UPDATED_IMMEDIATE_EMIT_AT) { + if (Tracker.Events.get_total () > GRAPH_UPDATED_IMMEDIATE_EMIT_AT) { // possibly active timeout no longer necessary as signals // for committed transactions will be emitted by the following on_emit_signals call // do this before actually calling on_emit_signals as on_emit_signals sets signal_timeout to 0 |