diff options
Diffstat (limited to 'bison-2.4-reap_subpipe.patch')
-rw-r--r-- | bison-2.4-reap_subpipe.patch | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/bison-2.4-reap_subpipe.patch b/bison-2.4-reap_subpipe.patch new file mode 100644 index 0000000..3f72c3e --- /dev/null +++ b/bison-2.4-reap_subpipe.patch @@ -0,0 +1,87 @@ +diff -urp bison-2.4-pm/lib/subpipe.c bison-2.4/lib/subpipe.c +--- bison-2.4-pm/lib/subpipe.c 2008-07-14 10:56:12.000000000 +0200 ++++ bison-2.4/lib/subpipe.c 2008-11-20 14:37:42.000000000 +0100 +@@ -143,7 +143,9 @@ create_subpipe (char const * const *argv + } + + +-/* Wait for the subprocess to exit. */ ++/* Wait for the subprocess to exit. PROGRAM==NULL means errors ++ shouldn't be emitted, typically becuase we are reaping the subpipe ++ in response to some other error. */ + + void + reap_subpipe (pid_t pid, char const *program) +@@ -151,11 +153,14 @@ reap_subpipe (pid_t pid, char const *pro + #if HAVE_WAITPID || defined waitpid + int wstatus; + if (waitpid (pid, &wstatus, 0) < 0) +- error (EXIT_FAILURE, errno, "waitpid"); ++ { ++ if (program) ++ error (EXIT_FAILURE, errno, "waitpid"); ++ } + else + { + int status = WIFEXITED (wstatus) ? WEXITSTATUS (wstatus) : -1; +- if (status) ++ if (status && program) + error (EXIT_FAILURE, 0, + _(status == 126 + ? "subsidiary program `%s' could not be invoked" +diff -urp bison-2.4-pm/src/output.c bison-2.4/src/output.c +--- bison-2.4-pm/src/output.c 2008-11-02 19:09:10.000000000 +0100 ++++ bison-2.4/src/output.c 2008-11-20 14:39:08.000000000 +0100 +@@ -467,6 +467,21 @@ prepare_actions (void) + | Call the skeleton parser. | + `---------------------------*/ + ++static pid_t pid = 0; ++ ++/* Clean up opened pipe. */ ++static void ++die (void) ++{ ++ static int dying = 0; ++ if (pid && !dying) ++ { ++ dying = 1; ++ reap_subpipe (pid, NULL); ++ pid = 0; ++ } ++} ++ + static void + output_skeleton (void) + { +@@ -474,7 +489,6 @@ output_skeleton (void) + FILE *out; + int filter_fd[2]; + char const *argv[9]; +- pid_t pid; + + /* Compute the names of the package data dir and skeleton files. */ + char const m4sugar[] = "m4sugar/m4sugar.m4"; +@@ -586,6 +600,7 @@ output_skeleton (void) + scan_skel (in); + xfclose (in); + reap_subpipe (pid, m4); ++ pid = 0; + timevar_pop (TV_M4); + } + +@@ -653,6 +669,14 @@ prepare (void) + void + output (void) + { ++ /* Register shutdown handler. */ ++ static int registered = 0; ++ if (!registered) ++ { ++ registered = 1; ++ atexit (die); ++ } ++ + obstack_init (&format_obstack); + + prepare_symbols (); |