aboutsummaryrefslogtreecommitdiff
path: root/multimedia
diff options
context:
space:
mode:
Diffstat (limited to 'multimedia')
-rw-r--r--multimedia/gstreamer/Makefile2
-rw-r--r--multimedia/gstreamer/files/patch-01_fix_gst_init_race_issue97
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);
+ }
+ }