diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2020-02-04 23:59:44 +0100 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2020-02-17 18:57:46 +0100 |
commit | 41d192ca17df329c05be60e7b6e3e8c2737439dc (patch) | |
tree | 5e430c9c3f86b66686ec97ce38e8ab7ff62126fe | |
parent | c6b13da5717e57fb974e68a6da5aa5743a989480 (diff) | |
download | tracker-41d192ca17df329c05be60e7b6e3e8c2737439dc.tar.gz |
libtracker-direct: Ensure queries get cancelled after close()
The query thread pool does not get awaited for completion, which
means later operations should error out orderly. Ensure this
actually happens, as documented in tracker_sparql_connection_close().
-rw-r--r-- | src/libtracker-direct/tracker-direct.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/src/libtracker-direct/tracker-direct.c b/src/libtracker-direct/tracker-direct.c index 0155a1fcc..8527f9672 100644 --- a/src/libtracker-direct/tracker-direct.c +++ b/src/libtracker-direct/tracker-direct.c @@ -45,6 +45,7 @@ struct _TrackerDirectConnectionPrivate GList *notifiers; guint initialized : 1; + guint closing : 1; }; enum { @@ -148,12 +149,26 @@ static void query_thread_pool_func (gpointer data, gpointer user_data) { + TrackerDirectConnection *conn = user_data; + TrackerDirectConnectionPrivate *priv; TrackerSparqlCursor *cursor; GTask *task = data; TaskData *task_data = g_task_get_task_data (task); GError *error = NULL; g_assert (task_data->type == TASK_TYPE_QUERY); + + priv = tracker_direct_connection_get_instance_private (conn); + + if (priv->closing) { + g_task_return_new_error (task, + G_IO_ERROR, + G_IO_ERROR_CONNECTION_CLOSED, + "Connection is closed"); + g_object_unref (task); + return; + } + cursor = tracker_sparql_connection_query (TRACKER_SPARQL_CONNECTION (g_task_get_source_object (task)), task_data->query, g_task_get_cancellable (task), @@ -898,6 +913,7 @@ tracker_direct_connection_close (TrackerSparqlConnection *self) conn = TRACKER_DIRECT_CONNECTION (self); priv = tracker_direct_connection_get_instance_private (conn); + priv->closing = TRUE; if (priv->update_thread) { g_thread_pool_free (priv->update_thread, TRUE, TRUE); |