summaryrefslogtreecommitdiff
path: root/core/glib2/partially-revert-ce0022933c255313e010b27f977f4ae02aad1e7e.patch
diff options
context:
space:
mode:
Diffstat (limited to 'core/glib2/partially-revert-ce0022933c255313e010b27f977f4ae02aad1e7e.patch')
-rw-r--r--core/glib2/partially-revert-ce0022933c255313e010b27f977f4ae02aad1e7e.patch132
1 files changed, 0 insertions, 132 deletions
diff --git a/core/glib2/partially-revert-ce0022933c255313e010b27f977f4ae02aad1e7e.patch b/core/glib2/partially-revert-ce0022933c255313e010b27f977f4ae02aad1e7e.patch
deleted file mode 100644
index f623c1b21..000000000
--- a/core/glib2/partially-revert-ce0022933c255313e010b27f977f4ae02aad1e7e.patch
+++ /dev/null
@@ -1,132 +0,0 @@
-From f3b1054b0ebb4912f700e08da0c3d35c30113e79 Mon Sep 17 00:00:00 2001
-From: Ryan Lortie <desrt@desrt.ca>
-Date: Tue, 23 Apr 2013 17:26:48 +0000
-Subject: Partially revert "Merge waitpid() from g_spawn_sync into gmain()"
-
-This partially reverts commit ce0022933c255313e010b27f977f4ae02aad1e7e.
-
-It used to be safe to use g_spawn_sync() from processes that had their
-own SIGCHLD handler because it simply called wait(). When it was
-changed to depend on the GLib child watching infrastructure this meant
-that GLib had to own the SIGCHLD handler.
-
-This caused hangs in at least Pidgin.
-
-The patch contained two other improvements to the child watch code which
-we want to keep, so only revert the changes to gspawn itself.
-
-https://bugzilla.gnome.org/show_bug.cgi?id=698081
----
-diff --git a/glib/gspawn.c b/glib/gspawn.c
-index 381ed5c..01cedf6 100644
---- a/glib/gspawn.c
-+++ b/glib/gspawn.c
-@@ -47,7 +47,6 @@
-
- #include "genviron.h"
- #include "gmem.h"
--#include "gmain.h"
- #include "gshell.h"
- #include "gstring.h"
- #include "gstrfuncs.h"
-@@ -207,21 +206,6 @@ read_data (GString *str,
- }
- }
-
--typedef struct {
-- GMainLoop *loop;
-- gint *status_p;
--} SyncWaitpidData;
--
--static void
--on_sync_waitpid (GPid pid,
-- gint status,
-- gpointer user_data)
--{
-- SyncWaitpidData *data = user_data;
-- *(data->status_p) = status;
-- g_main_loop_quit (data->loop);
--}
--
- /**
- * g_spawn_sync:
- * @working_directory: (allow-none): child's current working directory, or %NULL to inherit parent's
-@@ -277,7 +261,6 @@ g_spawn_sync (const gchar *working_directory,
- GString *errstr = NULL;
- gboolean failed;
- gint status;
-- SyncWaitpidData waitpid_data;
-
- g_return_val_if_fail (argv != NULL, FALSE);
- g_return_val_if_fail (!(flags & G_SPAWN_DO_NOT_REAP_CHILD), FALSE);
-@@ -410,32 +393,45 @@ g_spawn_sync (const gchar *working_directory,
- close_and_invalidate (&outpipe);
- if (errpipe >= 0)
- close_and_invalidate (&errpipe);
--
-- /* Now create a temporary main context and loop, with just one
-- * waitpid source. We used to invoke waitpid() directly here, but
-- * this way we unify with the worker thread in gmain.c.
-+
-+ /* Wait for child to exit, even if we have
-+ * an error pending.
- */
-- {
-- GMainContext *context;
-- GMainLoop *loop;
-- GSource *source;
--
-- context = g_main_context_new ();
-- loop = g_main_loop_new (context, TRUE);
-+ again:
-+
-+ ret = waitpid (pid, &status, 0);
-
-- waitpid_data.loop = loop;
-- waitpid_data.status_p = &status;
--
-- source = g_child_watch_source_new (pid);
-- g_source_set_callback (source, (GSourceFunc)on_sync_waitpid, &waitpid_data, NULL);
-- g_source_attach (source, context);
-- g_source_unref (source);
--
-- g_main_loop_run (loop);
-+ if (ret < 0)
-+ {
-+ if (errno == EINTR)
-+ goto again;
-+ else if (errno == ECHILD)
-+ {
-+ if (exit_status)
-+ {
-+ g_warning ("In call to g_spawn_sync(), exit status of a child process was requested but ECHILD was received by waitpid(). Most likely the process is ignoring SIGCHLD, or some other thread is invoking waitpid() with a nonpositive first argument; either behavior can break applications that use g_spawn_sync either directly or indirectly.");
-+ }
-+ else
-+ {
-+ /* We don't need the exit status. */
-+ }
-+ }
-+ else
-+ {
-+ if (!failed) /* avoid error pileups */
-+ {
-+ int errsv = errno;
-
-- g_main_context_unref (context);
-- g_main_loop_unref (loop);
-- }
-+ failed = TRUE;
-+
-+ g_set_error (error,
-+ G_SPAWN_ERROR,
-+ G_SPAWN_ERROR_READ,
-+ _("Unexpected error in waitpid() (%s)"),
-+ g_strerror (errsv));
-+ }
-+ }
-+ }
-
- if (failed)
- {
---
-cgit v0.9.1