summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2020-06-04 17:00:11 +0200
committerCarlos Garnacho <carlosg@gnome.org>2020-06-06 14:38:22 +0200
commit0a33f7cb251c0fced201048200883ff13a520aee (patch)
tree4656eef784ff905353aff2e981871b15bd2eb8ff /src
parentf5c7cc660c309856bea10b232b3c96d981d2e90e (diff)
downloadtracker-0a33f7cb251c0fced201048200883ff13a520aee.tar.gz
libtracker-direct: Use the update thread for update_array operations
These are no longer that much different. Concatenate the updates in the caller thread and funnel them through the only update thread so there's no possibility of mutex contention.
Diffstat (limited to 'src')
-rw-r--r--src/libtracker-direct/tracker-direct.c62
1 files changed, 18 insertions, 44 deletions
diff --git a/src/libtracker-direct/tracker-direct.c b/src/libtracker-direct/tracker-direct.c
index 348035624..c06256f9a 100644
--- a/src/libtracker-direct/tracker-direct.c
+++ b/src/libtracker-direct/tracker-direct.c
@@ -761,41 +761,6 @@ tracker_direct_connection_update_finish (TrackerSparqlConnection *self,
}
static void
-error_free (GError *error)
-{
- if (error)
- g_error_free (error);
-}
-
-static void
-update_array_async_thread_func (GTask *task,
- gpointer source_object,
- gpointer task_data,
- GCancellable *cancellable)
-{
- gchar **updates = task_data;
- gchar *concatenated;
- GPtrArray *errors;
- GError *error = NULL;
-
- errors = g_ptr_array_new_with_free_func ((GDestroyNotify) error_free);
- g_ptr_array_set_size (errors, g_strv_length (updates));
-
- concatenated = g_strjoinv ("\n", updates);
- tracker_sparql_connection_update (source_object, concatenated,
- g_task_get_priority (task),
- cancellable, &error);
- g_free (concatenated);
-
- if (error)
- g_task_return_error (task, error);
- else
- g_task_return_boolean (task, TRUE);
-
- g_object_unref (task);
-}
-
-static void
tracker_direct_connection_update_array_async (TrackerSparqlConnection *self,
gchar **updates,
gint n_updates,
@@ -804,22 +769,31 @@ tracker_direct_connection_update_array_async (TrackerSparqlConnection *self,
GAsyncReadyCallback callback,
gpointer user_data)
{
+ TrackerDirectConnectionPrivate *priv;
+ TrackerDirectConnection *conn;
+ TaskData *task_data;
GTask *task;
- gchar **copy;
- gint i = 0;
+ gchar *concatenated;
+ gchar **array_copy;
- copy = g_new0 (gchar*, n_updates + 1);
+ conn = TRACKER_DIRECT_CONNECTION (self);
+ priv = tracker_direct_connection_get_instance_private (conn);
- for (i = 0; i < n_updates; i++) {
- g_return_if_fail (updates[i] != NULL);
- copy[i] = g_strdup (updates[i]);
- }
+ /* Make a NULL-terminated array and concatenate it */
+ array_copy = g_new0 (gchar *, n_updates + 1);
+ memcpy (array_copy, updates, n_updates * sizeof (gchar *));
+ concatenated = g_strjoinv ("\n", array_copy);
+ g_free (array_copy);
+
+ task_data = task_data_query_new (TASK_TYPE_UPDATE, NULL);
+ task_data->query = concatenated;
task = g_task_new (self, cancellable, callback, user_data);
g_task_set_priority (task, priority);
- g_task_set_task_data (task, copy, (GDestroyNotify) g_strfreev);
+ g_task_set_task_data (task, task_data,
+ (GDestroyNotify) task_data_free);
- g_task_run_in_thread (task, update_array_async_thread_func);
+ g_thread_pool_push (priv->update_thread, task, NULL);
}
static gboolean