[gnome-builder] symbol-tree: ref resolvers across async tasks
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] symbol-tree: ref resolvers across async tasks
- Date: Wed, 3 Jan 2018 09:39:47 +0000 (UTC)
commit 6203563dd2809b7675b4be8753e9d396eead897e
Author: Christian Hergert <chergert redhat com>
Date: Wed Jan 3 01:38:21 2018 -0800
symbol-tree: ref resolvers across async tasks
This tasks runs asynchronously, so we need to ensure that we keep the
resolvers alive for the lifetime of the operation.
.../symbol-tree/gbp-symbol-layout-stack-addin.c | 25 ++++++++++++++-----
1 files changed, 18 insertions(+), 7 deletions(-)
---
diff --git a/src/plugins/symbol-tree/gbp-symbol-layout-stack-addin.c
b/src/plugins/symbol-tree/gbp-symbol-layout-stack-addin.c
index b76ac77..69bade0 100644
--- a/src/plugins/symbol-tree/gbp-symbol-layout-stack-addin.c
+++ b/src/plugins/symbol-tree/gbp-symbol-layout-stack-addin.c
@@ -49,6 +49,9 @@ typedef struct
static void
symbol_resolver_task_data_free (SymbolResolverTaskData *data)
{
+ g_assert (data != NULL);
+ g_assert (data->resolvers != NULL);
+
g_clear_pointer (&data->resolvers, g_ptr_array_unref);
g_clear_object (&data->buffer);
g_clear_pointer (&data->location, ide_source_location_unref);
@@ -62,8 +65,13 @@ get_extension (IdeExtensionSetAdapter *set,
gpointer user_data)
{
SymbolResolverTaskData *data = user_data;
+ IdeSymbolResolver *resolver = (IdeSymbolResolver *)extension;
+
+ g_assert (data != NULL);
+ g_assert (data->resolvers != NULL);
+ g_assert (IDE_IS_SYMBOL_RESOLVER (resolver));
- g_ptr_array_add (data->resolvers, IDE_SYMBOL_RESOLVER (extension));
+ g_ptr_array_add (data->resolvers, g_object_ref (resolver));
}
static void
@@ -142,14 +150,17 @@ gbp_symbol_layout_stack_addin_cursor_moved_cb (gpointer user_data)
self->scope_cancellable = g_cancellable_new ();
task = g_task_new (self, self->scope_cancellable, NULL, NULL);
+ g_task_set_source_tag (task, gbp_symbol_layout_stack_addin_cursor_moved_cb);
+ g_task_set_priority (task, G_PRIORITY_LOW);
data = g_slice_new0 (SymbolResolverTaskData);
- data->resolvers = g_ptr_array_new ();
+ data->resolvers = g_ptr_array_new_with_free_func (g_object_unref);
data->location = ide_buffer_get_insert_location (buffer);
+ data->buffer = g_object_ref (buffer);
+ g_task_set_task_data (task, data, (GDestroyNotify)symbol_resolver_task_data_free);
ide_extension_set_adapter_foreach (adapter, get_extension, data);
-
- g_task_set_task_data (task, data, (GDestroyNotify)symbol_resolver_task_data_free);
+ g_assert (data->resolvers->len > 0);
resolver = g_ptr_array_index (data->resolvers, data->resolvers->len - 1);
/* Go through symbol resolvers one by one to find nearest scope */
@@ -285,12 +296,12 @@ gbp_symbol_layout_stack_addin_update_tree (GbpSymbolLayoutStackAddin *self,
task = g_task_new (self, self->cancellable, NULL, NULL);
data = g_slice_new0 (SymbolResolverTaskData);
- data->resolvers = g_ptr_array_new ();
+ data->resolvers = g_ptr_array_new_with_free_func (g_object_unref);
data->buffer = g_object_ref (buffer);
+ g_task_set_task_data (task, data, (GDestroyNotify)symbol_resolver_task_data_free);
ide_extension_set_adapter_foreach (adapter, get_extension, data);
-
- g_task_set_task_data (task, data, (GDestroyNotify)symbol_resolver_task_data_free);
+ g_assert (data->resolvers->len > 0);
resolver = g_ptr_array_index (data->resolvers, data->resolvers->len - 1);
ide_symbol_resolver_get_symbol_tree_async (resolver,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]