[gnome-builder] workbench: simplify open file state tracking
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] workbench: simplify open file state tracking
- Date: Wed, 3 Jan 2018 11:04:29 +0000 (UTC)
commit 26d91d10e1ff06f61436c8f4369d33b91b967efa
Author: Christian Hergert <chergert redhat com>
Date: Wed Jan 3 03:04:15 2018 -0800
workbench: simplify open file state tracking
The previous code was more complicated than necessary doing the reference
count tracking. We can just rely on autoptr and task data for easier to
audit code.
src/libide/workbench/ide-workbench-open.c | 98 ++++++++++++++--------------
1 files changed, 49 insertions(+), 49 deletions(-)
---
diff --git a/src/libide/workbench/ide-workbench-open.c b/src/libide/workbench/ide-workbench-open.c
index 4e93916..3c53b7c 100644
--- a/src/libide/workbench/ide-workbench-open.c
+++ b/src/libide/workbench/ide-workbench-open.c
@@ -46,15 +46,27 @@ typedef struct
typedef struct
{
- gint ref_count;
- IdeWorkbench *self;
- GTask *task;
- GString *error_msg;
-} IdeWorkbenchOpenFilesState;
+ GString *errors;
+ guint active;
+} OpenFilesState;
static void ide_workbench_open_uri_try_next (IdeWorkbenchOpenUriState *open_uri_state);
static void
+open_files_state_free (gpointer data)
+{
+ OpenFilesState *state = data;
+
+ if (state->errors != NULL)
+ {
+ g_string_free (state->errors, TRUE);
+ state->errors = NULL;
+ }
+
+ g_slice_free (OpenFilesState, state);
+}
+
+static void
ide_workbench_collect_loaders (PeasExtensionSet *set,
PeasPluginInfo *plugin_info,
PeasExtension *extension,
@@ -322,37 +334,33 @@ ide_workbench_open_files_cb (GObject *object,
gpointer user_data)
{
IdeWorkbench *self = (IdeWorkbench *)object;
- IdeWorkbenchOpenFilesState *open_files_state = user_data;
- GError *error = NULL;
+ g_autoptr(GTask) task = user_data;
+ g_autoptr(GError) error = NULL;
+ OpenFilesState *task_data;
g_assert (IDE_IS_WORKBENCH (self));
- g_assert (open_files_state->self == self);
- g_assert (open_files_state->ref_count > 0);
- g_assert (open_files_state->error_msg != NULL);
- g_assert (G_IS_TASK (open_files_state->task));
+ g_assert (G_IS_ASYNC_RESULT (result));
+ g_assert (G_IS_TASK (task));
- if (!ide_workbench_open_uri_finish (self, result, &error))
- {
- g_string_append (open_files_state->error_msg, error->message);
- g_clear_error (&error);
- }
+ task_data = g_task_get_task_data (task);
+ g_assert (task_data != NULL);
+ g_assert (task_data->errors != NULL);
+ g_assert (task_data->active > 0);
+
+ task_data->active--;
- open_files_state->ref_count--;
+ if (!ide_workbench_open_uri_finish (self, result, &error))
+ g_string_append_printf (task_data->errors, "%s ", error->message);
- if (open_files_state->ref_count == 0)
+ if (task_data->active == 0)
{
- if (open_files_state->error_msg->len > 0)
- g_task_return_new_error (open_files_state->task,
+ if (task_data->errors->len > 0)
+ g_task_return_new_error (task,
G_IO_ERROR,
G_IO_ERROR_FAILED,
- "%s",
- open_files_state->error_msg->str);
+ "%s", task_data->errors->str);
else
- g_task_return_boolean (open_files_state->task, TRUE);
-
- g_string_free (open_files_state->error_msg, TRUE);
- g_clear_object (&open_files_state->task);
- g_free (open_files_state);
+ g_task_return_boolean (task, TRUE);
}
}
@@ -381,45 +389,37 @@ ide_workbench_open_files_async (IdeWorkbench *self,
GAsyncReadyCallback callback,
gpointer user_data)
{
- IdeWorkbenchOpenFilesState *open_files_state;
- gint i;
+ g_autoptr(GTask) task = NULL;
+ OpenFilesState *task_data;
g_return_if_fail (IDE_IS_WORKBENCH (self));
g_return_if_fail ((n_files > 0 && files != NULL) || (n_files == 0));
g_return_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable));
+ task = g_task_new (self, cancellable, callback, user_data);
+ g_task_set_source_tag (task, ide_workbench_open_files_async);
+ g_task_set_priority (task, G_PRIORITY_LOW);
+
if (n_files == 0)
{
- GTask *task;
-
- task = g_task_new (self, cancellable, callback, user_data);
g_task_return_boolean (task, TRUE);
- g_object_unref (task);
-
return;
}
- open_files_state = g_new0 (IdeWorkbenchOpenFilesState, 1);
- open_files_state->ref_count = n_files;
- open_files_state->self = self;
- open_files_state->task = g_task_new (self, cancellable, callback, user_data);
- open_files_state->error_msg = g_string_new (NULL);
+ task_data = g_slice_new0 (OpenFilesState);
+ task_data->errors = g_string_new (NULL);
+ task_data->active = n_files;
- g_assert (n_files > 0);
+ g_task_set_task_data (task, task_data, open_files_state_free);
- for (i = 0; i < n_files; i++)
+ for (guint i = 0; i < n_files; i++)
{
- IdeUri *uri;
+ g_autoptr(IdeUri) uri = ide_uri_new_from_file (files [i]);
- uri = ide_uri_new_from_file (files [i]);
- ide_workbench_open_uri_async (self,
- uri,
- hint,
- flags,
+ ide_workbench_open_uri_async (self, uri, hint, flags,
cancellable,
ide_workbench_open_files_cb,
- open_files_state);
- ide_uri_unref (uri);
+ g_object_ref (task));
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]