diff options
author | Jeremy Messenger <mezz@FreeBSD.org> | 2006-10-21 21:58:22 +0000 |
---|---|---|
committer | Jeremy Messenger <mezz@FreeBSD.org> | 2006-10-21 21:58:22 +0000 |
commit | 04471b77b18ab3514d6c83b4b6ce68ad14b055d4 (patch) | |
tree | 6149a54176092716fb163e0012da34a297e46c65 /multimedia | |
parent | Add NO_LATEST_LINK to avoid conflict with graphics/gimp. (diff) |
Fix the ensure_current_registry_forking() fails if zombie already killed by
signal handler. Patch was took from Ubuntu. Bump the PORTREVISION.
https://launchpad.net/distros/ubuntu/+source/control-center/+bug/59217
http://bugzilla.gnome.org/show_bug.cgi?id=355499
PR: ports/104617
Submitted by: Marcin Wisnicki <mwisnicki+freebsd@gmail.com>
Approved by: portmgr (marcus)
Notes
Notes:
svn path=/head/; revision=175478
Diffstat (limited to 'multimedia')
-rw-r--r-- | multimedia/gstreamer/Makefile | 2 | ||||
-rw-r--r-- | multimedia/gstreamer/files/patch-01_fix_gst_init_race_issue | 97 |
2 files changed, 99 insertions, 0 deletions
diff --git a/multimedia/gstreamer/Makefile b/multimedia/gstreamer/Makefile index 0ced9734ba4c..7e6b20781d10 100644 --- a/multimedia/gstreamer/Makefile +++ b/multimedia/gstreamer/Makefile @@ -4,9 +4,11 @@ # # $FreeBSD$ # $MCom: ports/multimedia/gstreamer/Makefile,v 1.52 2006/09/14 20:51:42 ahze Exp $ +# PORTNAME= gstreamer PORTVERSION= 0.10.10 +PORTREVISION= 1 CATEGORIES= multimedia MASTER_SITES= http://gstreamer.freedesktop.org/src/gstreamer/ \ ${MASTER_SITE_LOCAL} diff --git a/multimedia/gstreamer/files/patch-01_fix_gst_init_race_issue b/multimedia/gstreamer/files/patch-01_fix_gst_init_race_issue new file mode 100644 index 000000000000..b3533c909a3a --- /dev/null +++ b/multimedia/gstreamer/files/patch-01_fix_gst_init_race_issue @@ -0,0 +1,97 @@ +diff -Nur gst/gst.c gst/gst.c +--- gst/gst.c 2006-09-14 16:02:23.000000000 +0200 ++++ gst/gst.c 2006-10-05 21:46:11.000000000 +0200 +@@ -683,10 +683,16 @@ + { + #ifdef HAVE_FORK + pid_t pid; ++ int pfd[2]; + + /* We fork here, and let the child read and possibly rebuild the registry. + * After that, the parent will re-read the freshly generated registry. */ + GST_DEBUG ("forking"); ++ ++ if (pipe (pfd) == -1) { ++ return FALSE; ++ } ++ + pid = fork (); + if (pid == -1) { + GST_ERROR ("Failed to fork()"); +@@ -695,8 +701,11 @@ + + if (pid == 0) { + gboolean res; ++ gchar res_byte; + +- /* this is the child */ ++ /* this is the child. Close the read pipe */ ++ close (pfd[0]); ++ + GST_DEBUG ("child reading registry cache"); + res = scan_and_update_registry (default_registry, registry_file, TRUE); + _gst_registry_remove_cache_plugins (default_registry); +@@ -708,38 +717,42 @@ + /* make valgrind happy (yes, you can call it insane) */ + g_free ((char *) registry_file); + +- _exit ((res) ? EXIT_SUCCESS : EXIT_FAILURE); ++ /* write a result byte to the pipe */ ++ res_byte = res ? '1' : '0'; ++ write (pfd[1], &res_byte, 1); ++ _exit (0); + } else { +- /* parent */ +- int status; +- pid_t ret; ++ int ret; ++ gchar res_byte; ++ ++ /* parent. Close write pipe */ ++ close (pfd[1]); ++ ++ /* Wait for result from the pipe */ ++ GST_DEBUG ("Waiting for data from child"); ++ ret = read (pfd[0], &res_byte, 1); + +- GST_DEBUG ("parent waiting on child"); +- ret = waitpid (pid, &status, 0); +- GST_DEBUG ("parent done waiting on child"); + if (ret == -1) { +- GST_ERROR ("error during waitpid: %s", g_strerror (errno)); ++ close (pfd[0]); + return FALSE; + } ++ close (pfd[0]); + +- if (!WIFEXITED (status)) { +- if (WIFSIGNALED (status)) { +- GST_ERROR ("child did not exit normally, terminated by signal %d", +- WTERMSIG (status)); +- } else { +- GST_ERROR ("child did not exit normally, status: %d", status); +- } ++ /* Wait to ensure the child is reaped, but ignore the result */ ++ GST_DEBUG ("parent waiting on child"); ++ waitpid (pid, NULL, 0); ++ GST_DEBUG ("parent done waiting on child"); ++ ++ if (ret == 0) { ++ GST_ERROR ("child did not exit normally, terminated by signal"); + return FALSE; + } + +- GST_DEBUG ("child exited normally with return value %d", +- WEXITSTATUS (status)); +- +- if (WEXITSTATUS (status) == EXIT_SUCCESS) { +- GST_DEBUG ("parent reading registry cache"); ++ if (res_byte == '1') { ++ GST_DEBUG ("Child succeeded. Parent reading registry cache"); + gst_registry_xml_read_cache (default_registry, registry_file); + } else { +- GST_DEBUG ("parent re-scanning registry"); ++ GST_DEBUG ("Child failed. Parent re-scanning registry, ignoring errors."); + scan_and_update_registry (default_registry, registry_file, FALSE); + } + } |