Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
a7e5678
commit a262b0c
Showing
2 changed files
with
421 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 (); |
Oops, something went wrong.