summaryrefslogtreecommitdiff
path: root/src/libtracker-sparql/tracker-notifier.c
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2020-06-27 18:37:30 +0200
committerCarlos Garnacho <carlosg@gnome.org>2020-06-27 19:10:22 +0200
commitb418cb17e1982dfd9be88d0543fd02e69af68583 (patch)
treee652bae0e449c6e738a4bf2cb5bc105ce8d16078 /src/libtracker-sparql/tracker-notifier.c
parentaa3678642959316108efa14cd4c3b90be2b18f37 (diff)
downloadtracker-b418cb17e1982dfd9be88d0543fd02e69af68583.tar.gz
libtracker-sparql: Handle notifier query cursor in a thread
Take this out of the main thread, so we don't block it when dealing with large sets of changes.
Diffstat (limited to 'src/libtracker-sparql/tracker-notifier.c')
-rw-r--r--src/libtracker-sparql/tracker-notifier.c86
1 files changed, 63 insertions, 23 deletions
diff --git a/src/libtracker-sparql/tracker-notifier.c b/src/libtracker-sparql/tracker-notifier.c
index 4f607f056..21101f9b1 100644
--- a/src/libtracker-sparql/tracker-notifier.c
+++ b/src/libtracker-sparql/tracker-notifier.c
@@ -472,33 +472,17 @@ ensure_extra_info_statement (TrackerNotifier *notifier,
}
static void
-query_extra_info_cb (GObject *object,
- GAsyncResult *res,
- gpointer user_data)
+handle_cursor (GTask *task,
+ gpointer source_object,
+ gpointer task_data,
+ GCancellable *cancellable)
{
- TrackerNotifierEventCache *cache = user_data;
- TrackerSparqlStatement *statement;
- TrackerSparqlCursor *cursor;
+ TrackerNotifierEventCache *cache = task_data;
+ TrackerSparqlCursor *cursor = source_object;
TrackerNotifierEvent *event;
GSequenceIter *iter;
- GError *error = NULL;
gint64 id;
- statement = TRACKER_SPARQL_STATEMENT (object);
- cursor = tracker_sparql_statement_execute_finish (statement, res, &error);
-
- if (!cursor) {
- if (!g_error_matches (error,
- G_IO_ERROR,
- G_IO_ERROR_CANCELLED)) {
- g_critical ("Could not get cursor: %s\n", error->message);
- }
-
- _tracker_notifier_event_cache_free (cache);
- g_clear_error (&error);
- return;
- }
-
iter = g_sequence_get_begin_iter (cache->sequence);
/* We rely here in both the GPtrArray and the query items being
@@ -523,9 +507,65 @@ query_extra_info_cb (GObject *object,
event->urn = g_strdup (tracker_sparql_cursor_get_string (cursor, 1, NULL));
}
- g_object_unref (cursor);
+ tracker_sparql_cursor_close (cursor);
tracker_notifier_emit_events_in_idle (cache);
+
+ g_task_return_boolean (task, TRUE);
+}
+
+static void
+finish_query (GObject *source_object,
+ GAsyncResult *res,
+ gpointer user_data)
+{
+ TrackerSparqlCursor *cursor = TRACKER_SPARQL_CURSOR (source_object);
+ GError *error = NULL;
+
+ if (!g_task_propagate_boolean (G_TASK (res), &error)) {
+ if (!g_error_matches (error,
+ G_IO_ERROR,
+ G_IO_ERROR_CANCELLED)) {
+ g_critical ("Error querying notified data: %s\n", error->message);
+ }
+ }
+
+ g_object_unref (cursor);
+ g_clear_error (&error);
+}
+
+static void
+query_extra_info_cb (GObject *object,
+ GAsyncResult *res,
+ gpointer user_data)
+{
+ TrackerNotifierEventCache *cache = user_data;
+ TrackerSparqlStatement *statement;
+ TrackerNotifierPrivate *priv;
+ TrackerSparqlCursor *cursor;
+ GError *error = NULL;
+ GTask *task;
+
+ statement = TRACKER_SPARQL_STATEMENT (object);
+ cursor = tracker_sparql_statement_execute_finish (statement, res, &error);
+ priv = tracker_notifier_get_instance_private (cache->notifier);
+
+ if (!cursor) {
+ if (!g_error_matches (error,
+ G_IO_ERROR,
+ G_IO_ERROR_CANCELLED)) {
+ g_critical ("Could not get cursor: %s\n", error->message);
+ }
+
+ _tracker_notifier_event_cache_free (cache);
+ g_clear_error (&error);
+ return;
+ }
+
+ task = g_task_new (cursor, priv->cancellable, finish_query, NULL);
+ g_task_set_task_data (task, cache, NULL);
+ g_task_run_in_thread (task, handle_cursor);
+ g_object_unref (task);
}
static void