summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2020-02-04 23:59:44 +0100
committerCarlos Garnacho <carlosg@gnome.org>2020-02-17 18:57:46 +0100
commit41d192ca17df329c05be60e7b6e3e8c2737439dc (patch)
tree5e430c9c3f86b66686ec97ce38e8ab7ff62126fe
parentc6b13da5717e57fb974e68a6da5aa5743a989480 (diff)
downloadtracker-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.c16
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);