summaryrefslogtreecommitdiff
path: root/src/tracker-store/tracker-events.c
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 /src/tracker-store/tracker-events.c
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.
Diffstat (limited to 'src/tracker-store/tracker-events.c')
-rw-r--r--src/tracker-store/tracker-events.c29
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;
}