diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2020-06-27 18:37:30 +0200 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2020-06-27 19:10:22 +0200 |
commit | b418cb17e1982dfd9be88d0543fd02e69af68583 (patch) | |
tree | e652bae0e449c6e738a4bf2cb5bc105ce8d16078 /src/libtracker-sparql/tracker-notifier.c | |
parent | aa3678642959316108efa14cd4c3b90be2b18f37 (diff) | |
download | tracker-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.c | 86 |
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 |