diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2018-09-09 12:15:36 +0200 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2018-09-09 13:29:31 +0200 |
commit | ff36b9129e813b1354286e51e2ec629dbe794ea6 (patch) | |
tree | dd1fa9a0afdde64e6fa5e84e5d68ff13bd6b80c9 | |
parent | 903b82919e8204d1bf7f6a071b4a200db499c6d5 (diff) | |
download | tracker-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.c | 11 |
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); |