summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2017-11-25 13:19:44 +0100
committerCarlos Garnacho <carlosg@gnome.org>2018-07-20 18:27:32 +0200
commit683035a5fd4585ae8cfb30ed9acbcefd43fd0ba1 (patch)
treec0fa900bb72d6cd385ae08722a041790a9903f40
parent0d8083510296dd2996a60a62a00579481c9aa7fb (diff)
downloadtracker-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.c29
-rw-r--r--src/tracker-store/tracker-events.h2
-rw-r--r--src/tracker-store/tracker-events.vapi2
-rw-r--r--src/tracker-store/tracker-resources.vala5
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