diff options
author | mezz <mezz@FreeBSD.org> | 2006-10-22 05:58:22 +0800 |
---|---|---|
committer | mezz <mezz@FreeBSD.org> | 2006-10-22 05:58:22 +0800 |
commit | 96833621879eadc385c37f6d47a3d52c2082a8ef (patch) | |
tree | ffc43daf0153074cabd1688eab537f7453d580e5 /multimedia | |
parent | 8f6a91166d343870660ca895323febbca907e9a3 (diff) | |
download | freebsd-ports-graphics-96833621879eadc385c37f6d47a3d52c2082a8ef.tar.gz freebsd-ports-graphics-96833621879eadc385c37f6d47a3d52c2082a8ef.tar.zst freebsd-ports-graphics-96833621879eadc385c37f6d47a3d52c2082a8ef.zip |
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)
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 0ced9734ba4..7e6b20781d1 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 00000000000..b3533c909a3 --- /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); + } + } |