summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2018-09-09 12:15:36 +0200
committerCarlos Garnacho <carlosg@gnome.org>2018-09-09 13:29:31 +0200
commitff36b9129e813b1354286e51e2ec629dbe794ea6 (patch)
treedd1fa9a0afdde64e6fa5e84e5d68ff13bd6b80c9
parent903b82919e8204d1bf7f6a071b4a200db499c6d5 (diff)
downloadtracker-ff36b9129e813b1354286e51e2ec629dbe794ea6.tar.gz
libtracker-miner: Untangle SPARQL buffer task memory management
On one hand, the refcounting assignment was wrong, the task callback is meant to receive a reference on the TrackerTask where it was getting none. On the other hand, after fixing it there is a circular reference between the GTask and the TrackerTask that would prevent both to be freed, break it by disposing the GTask as soon as it's dispatched.
-rw-r--r--src/libtracker-miner/tracker-sparql-buffer.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/src/libtracker-miner/tracker-sparql-buffer.c b/src/libtracker-miner/tracker-sparql-buffer.c
index ac52b3a92..899cbe0e2 100644
--- a/src/libtracker-miner/tracker-sparql-buffer.c
+++ b/src/libtracker-miner/tracker-sparql-buffer.c
@@ -276,9 +276,13 @@ tracker_sparql_buffer_update_array_cb (GObject *object,
g_task_return_error (task_data->async_task,
g_error_copy (error));
} else {
- g_task_return_pointer (task_data->async_task, task, NULL);
+ g_task_return_pointer (task_data->async_task,
+ tracker_task_ref (task),
+ (GDestroyNotify) tracker_task_unref);
}
+ g_clear_object (&task_data->async_task);
+
/* No need to deallocate the task here, it will be done when
* unref-ing the UpdateArrayData below */
}
@@ -382,9 +386,12 @@ tracker_sparql_buffer_update_cb (GObject *object,
g_task_return_error (task_data->async_task, error);
} else {
g_task_return_pointer (task_data->async_task,
- update_data->task, NULL);
+ tracker_task_ref (update_data->task),
+ (GDestroyNotify) tracker_task_unref);
}
+ g_clear_object (&task_data->async_task);
+
tracker_task_pool_remove (TRACKER_TASK_POOL (update_data->buffer),
update_data->task);
g_slice_free (UpdateData, update_data);