summaryrefslogtreecommitdiff
path: root/src/libtracker-sparql/tracker-notifier.c
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2020-01-27 13:51:05 +0100
committerCarlos Garnacho <carlosg@gnome.org>2020-02-17 18:57:46 +0100
commitc801ad0854e5a9097b7f2509aecc9b1556157451 (patch)
tree03b65180141db99a683732cfdee4923cc69966f3 /src/libtracker-sparql/tracker-notifier.c
parentcff7ffcef3d7570fcd5d6c1b8ae702cb3a1071ad (diff)
downloadtracker-c801ad0854e5a9097b7f2509aecc9b1556157451.tar.gz
libtracker-sparql: Always emit TrackerNotifier::events on an idle
This ensures the callback will be dispatched outside of the updates thread, and presumably into the main application thread/main context. Also makes this function dependent on a main loop.
Diffstat (limited to 'src/libtracker-sparql/tracker-notifier.c')
-rw-r--r--src/libtracker-sparql/tracker-notifier.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/src/libtracker-sparql/tracker-notifier.c b/src/libtracker-sparql/tracker-notifier.c
index c1fe97fdb..332483cd3 100644
--- a/src/libtracker-sparql/tracker-notifier.c
+++ b/src/libtracker-sparql/tracker-notifier.c
@@ -289,7 +289,7 @@ tracker_notifier_event_cache_take_events (TrackerNotifierEventCache *cache)
return events;
}
-static void
+static gboolean
tracker_notifier_emit_events (TrackerNotifierEventCache *cache)
{
GPtrArray *events;
@@ -300,6 +300,17 @@ tracker_notifier_emit_events (TrackerNotifierEventCache *cache)
g_signal_emit (cache->notifier, signals[EVENTS], 0, cache->service, cache->graph, events);
g_ptr_array_unref (events);
}
+
+ return G_SOURCE_REMOVE;
+}
+
+static void
+tracker_notifier_emit_events_in_idle (TrackerNotifierEventCache *cache)
+{
+ g_idle_add_full (G_PRIORITY_DEFAULT,
+ (GSourceFunc) tracker_notifier_emit_events,
+ cache,
+ (GDestroyNotify) _tracker_notifier_event_cache_free);
}
static gchar *
@@ -389,8 +400,7 @@ query_extra_info_cb (GObject *object,
g_object_unref (cursor);
- tracker_notifier_emit_events (cache);
- _tracker_notifier_event_cache_free (cache);
+ tracker_notifier_emit_events_in_idle (cache);
}
static void
@@ -418,14 +428,15 @@ _tracker_notifier_event_cache_flush_events (TrackerNotifierEventCache *cache)
TrackerNotifier *notifier = cache->notifier;
TrackerNotifierPrivate *priv = tracker_notifier_get_instance_private (notifier);
- if (g_sequence_is_empty (cache->sequence))
+ if (g_sequence_is_empty (cache->sequence)) {
_tracker_notifier_event_cache_free (cache);
+ return;
+ }
if (priv->flags & TRACKER_NOTIFIER_FLAG_QUERY_URN) {
tracker_notifier_query_extra_info (notifier, cache);
} else {
- tracker_notifier_emit_events (cache);
- _tracker_notifier_event_cache_free (cache);
+ tracker_notifier_emit_events_in_idle (cache);
}
}