[gnome-builder] subprocess: use default main context on main thread
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] subprocess: use default main context on main thread
- Date: Wed, 14 Sep 2016 01:16:50 +0000 (UTC)
commit 1ce37729b5f2fd3682379136f08ac9d8128c62e5
Author: Christian Hergert <chergert redhat com>
Date: Tue Sep 13 18:14:44 2016 -0700
subprocess: use default main context on main thread
If we are on the main thread, just use the g_main_context_default(), so
that things like GDBusConnection make progress.
We might want to find a way to do this so we create the main context when
starting the process (so our GDBusConnection shares the thread default
context).
libide/subprocess/ide-breakout-subprocess.c | 47 +++++++++++++++++---------
1 files changed, 31 insertions(+), 16 deletions(-)
---
diff --git a/libide/subprocess/ide-breakout-subprocess.c b/libide/subprocess/ide-breakout-subprocess.c
index 7fec6e3..1d1aa8b 100644
--- a/libide/subprocess/ide-breakout-subprocess.c
+++ b/libide/subprocess/ide-breakout-subprocess.c
@@ -34,6 +34,7 @@
#include "ide-debug.h"
#include "ide-macros.h"
+#include "application/ide-application.h"
#include "subprocess/ide-breakout-subprocess.h"
#ifndef FLATPAK_HOST_COMMAND_FLAGS_CLEAR_ENV
@@ -298,8 +299,10 @@ communicate_result_validate_utf8 (const char *stream_name,
GMemoryOutputStream *buffer,
GError **error)
{
+ IDE_ENTRY;
+
if (return_location == NULL)
- return TRUE;
+ IDE_RETURN (TRUE);
if (buffer)
{
@@ -312,13 +315,13 @@ communicate_result_validate_utf8 (const char *stream_name,
"Invalid UTF-8 in child %s at offset %lu",
stream_name,
(unsigned long) (end - *return_location));
- return FALSE;
+ IDE_RETURN (FALSE);
}
}
else
*return_location = NULL;
- return TRUE;
+ IDE_RETURN (TRUE);
}
gboolean
@@ -331,6 +334,8 @@ ide_subprocess_communicate_utf8_finish (IdeSubprocess *subprocess,
gboolean ret = FALSE;
CommunicateState *state;
+ IDE_ENTRY;
+
g_return_val_if_fail (IDE_IS_BREAKOUT_SUBPROCESS (subprocess), FALSE);
g_return_val_if_fail (g_task_is_valid (result, subprocess), FALSE);
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
@@ -339,20 +344,20 @@ ide_subprocess_communicate_utf8_finish (IdeSubprocess *subprocess,
state = g_task_get_task_data ((GTask*)result);
if (!g_task_propagate_boolean ((GTask*)result, error))
- goto out;
+ IDE_GOTO (out);
if (!communicate_result_validate_utf8 ("stdout", stdout_buf, state->stdout_buf, error))
- goto out;
+ IDE_GOTO (out);
if (!communicate_result_validate_utf8 ("stderr", stderr_buf, state->stderr_buf, error))
- goto out;
+ IDE_GOTO (out);
ret = TRUE;
out:
g_object_unref (result);
- return ret;
+ IDE_RETURN (ret);
}
static gboolean
@@ -369,6 +374,8 @@ ide_breakout_subprocess_communicate_utf8 (IdeSubprocess *subprocess,
size_t stdin_buf_len = 0;
gboolean success;
+ IDE_ENTRY;
+
g_return_val_if_fail (IDE_IS_BREAKOUT_SUBPROCESS (subprocess), FALSE);
g_return_val_if_fail (stdin_buf == NULL || (self->flags & G_SUBPROCESS_FLAGS_STDIN_PIPE), FALSE);
g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), FALSE);
@@ -388,7 +395,7 @@ ide_breakout_subprocess_communicate_utf8 (IdeSubprocess *subprocess,
ide_breakout_subprocess_sync_complete (&result);
success = ide_subprocess_communicate_utf8_finish (subprocess, result, stdout_buf, stderr_buf, error);
- return success;
+ IDE_RETURN (success);
}
static gboolean
@@ -501,8 +508,10 @@ ide_breakout_subprocess_force_exit (IdeSubprocess *subprocess)
static void
ide_breakout_subprocess_sync_setup (void)
{
- /* Leak ref until ide_breakout_subprocess_sync_complete() */
- g_main_context_push_thread_default (g_main_context_new ());
+ if (IDE_IS_MAIN_THREAD ())
+ g_main_context_push_thread_default (g_main_context_ref (g_main_context_default ()));
+ else
+ g_main_context_push_thread_default (g_main_context_new ());
}
static void
@@ -517,10 +526,7 @@ ide_breakout_subprocess_sync_complete (GAsyncResult **result)
while (*result == NULL)
g_main_context_iteration (context, TRUE);
-
g_main_context_pop_thread_default (context);
-
- /* Unref pair for ide_breakout_subprocess_sync_setup() */
g_main_context_unref (context);
IDE_EXIT;
@@ -666,6 +672,8 @@ ide_breakout_subprocess_communicate_internal (IdeBreakoutSubprocess *subprocess,
CommunicateState *state;
g_autoptr(GTask) task = NULL;
+ IDE_ENTRY;
+
g_assert (IDE_IS_BREAKOUT_SUBPROCESS (subprocess));
g_assert (!cancellable || G_IS_CANCELLABLE (cancellable));
@@ -721,7 +729,7 @@ ide_breakout_subprocess_communicate_internal (IdeBreakoutSubprocess *subprocess,
ide_subprocess_communicate_made_progress, g_object_ref (task));
state->outstanding_ops++;
- return state;
+ IDE_RETURN (state);
}
static void
@@ -751,6 +759,8 @@ ide_breakout_subprocess_communicate_finish (IdeSubprocess *subprocess,
GTask *task = (GTask *)result;
gboolean success;
+ IDE_ENTRY;
+
g_assert (IDE_IS_BREAKOUT_SUBPROCESS (self));
g_assert (G_IS_TASK (task));
@@ -772,7 +782,7 @@ ide_breakout_subprocess_communicate_finish (IdeSubprocess *subprocess,
g_object_unref (task);
- return success;
+ IDE_RETURN (success);
}
static gboolean
@@ -786,6 +796,9 @@ ide_breakout_subprocess_communicate (IdeSubprocess *subprocess,
IdeBreakoutSubprocess *self = (IdeBreakoutSubprocess *)subprocess;
g_autoptr(GMainContext) main_context = g_main_context_new ();
g_autoptr(GAsyncResult) result = NULL;
+ gboolean ret;
+
+ IDE_ENTRY;
g_assert (IDE_IS_BREAKOUT_SUBPROCESS (self));
g_assert (!cancellable || G_IS_CANCELLABLE (cancellable));
@@ -799,7 +812,9 @@ ide_breakout_subprocess_communicate (IdeSubprocess *subprocess,
&result);
ide_breakout_subprocess_sync_complete (&result);
- return ide_breakout_subprocess_communicate_finish (subprocess, result, stdout_buf, stderr_buf, error);
+ ret = ide_breakout_subprocess_communicate_finish (subprocess, result, stdout_buf, stderr_buf, error);
+
+ IDE_RETURN (ret);
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]