[glib2] Fix pidgin freezes by applying patch from master (#956872)

Thorsten Leemhuis thl at fedoraproject.org
Mon Apr 29 16:19:10 UTC 2013


commit 7bf82110821871096be94d5fbc9aa419ef789edb
Author: Thorsten Leemhuis <fedora at leemhuis.info>
Date:   Mon Apr 29 18:21:37 2013 +0200

    Fix pidgin freezes by applying patch from master (#956872)

 ...erge_waitpid_from_g_spawn_sync_into_gmain.patch |  133 ++++++++++++++++++++
 glib2.spec                                         |    9 ++-
 2 files changed, 141 insertions(+), 1 deletions(-)
---
diff --git a/glib2-partially_revert_merge_waitpid_from_g_spawn_sync_into_gmain.patch b/glib2-partially_revert_merge_waitpid_from_g_spawn_sync_into_gmain.patch
new file mode 100644
index 0000000..848ffea
--- /dev/null
+++ b/glib2-partially_revert_merge_waitpid_from_g_spawn_sync_into_gmain.patch
@@ -0,0 +1,133 @@
+From f3b1054b0ebb4912f700e08da0c3d35c30113e79 Mon Sep 17 00:00:00 2001
+From: Ryan Lortie <desrt at 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
+
diff --git a/glib2.spec b/glib2.spec
index a4826bd..51a3f51 100644
--- a/glib2.spec
+++ b/glib2.spec
@@ -1,12 +1,15 @@
 Summary: A library of handy utility functions
 Name: glib2
 Version: 2.36.1
-Release: 1%{?dist}
+Release: 2%{?dist}
 License: LGPLv2+
 Group: System Environment/Libraries
 URL: http://www.gtk.org
 #VCS: git:git://git.gnome.org/glib
 Source: http://download.gnome.org/sources/glib/2.36/glib-%{version}.tar.xz
+# patch0 was is commit eb860fd on master and f3b1054b in 2.36 
+# backgrounds: https://bugzilla.gnome.org/show_bug.cgi?id=698081
+Patch0: %{name}-partially_revert_merge_waitpid_from_g_spawn_sync_into_gmain.patch
 
 BuildRequires: pkgconfig
 BuildRequires: gettext
@@ -64,6 +67,7 @@ The glib2-fam package contains the FAM (File Alteration Monitor) module for GIO.
 
 %prep
 %setup -q -n glib-%{version}
+%patch0 -p1 -b .patch0
 
 %build
 # Support builds of both git snapshots and tarballs packed with autogoo
@@ -184,6 +188,9 @@ gio-querymodules-%{__isa_bits} %{_libdir}/gio/modules
 %{_libdir}/gio/modules/libgiofam.so
 
 %changelog
+* Sat Apr 27 2013 Thorsten Leemhuis <fedora at leemhuis.info> - 2.36.1-2
+- Fix pidgin freezes by applying patch from master (#956872)
+
 * Mon Apr 15 2013 Kalev Lember <kalevlember at gmail.com> - 2.36.1-1
 - Update to 2.36.1
 


More information about the scm-commits mailing list