summaryrefslogtreecommitdiffstats
path: root/libiberty/pex-common.c
diff options
context:
space:
mode:
authormacro <macro@138bc75d-0d04-0410-961f-82ee72b054a4>2010-08-20 22:39:58 +0000
committermacro <macro@138bc75d-0d04-0410-961f-82ee72b054a4>2010-08-20 22:39:58 +0000
commit7492a1088def8c9bbbf876d19814ee720650b779 (patch)
treea57e67974483fcf221523c327577dc6cb1a5e447 /libiberty/pex-common.c
parent98ff07a965b12a481854f4a2945612edeb0c6144 (diff)
downloadppe42-gcc-7492a1088def8c9bbbf876d19814ee720650b779.tar.gz
ppe42-gcc-7492a1088def8c9bbbf876d19814ee720650b779.zip
* pex-common.c (pex_read_err): Set stderr_pipe to -1 if a
corresponding stream has been opened. (pex_free): Close pipe file descriptors corresponding to child's stdout and stderr before waiting. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@163426 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libiberty/pex-common.c')
-rw-r--r--libiberty/pex-common.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/libiberty/pex-common.c b/libiberty/pex-common.c
index 9a9fe241957..b32c54cc683 100644
--- a/libiberty/pex-common.c
+++ b/libiberty/pex-common.c
@@ -505,6 +505,7 @@ pex_read_err (struct pex_obj *obj, int binary)
if (o < 0 || o == STDIN_FILE_NO)
return NULL;
obj->read_err = obj->funcs->fdopenr (obj, o, binary);
+ obj->stderr_pipe = -1;
return obj->read_err;
}
@@ -597,8 +598,17 @@ pex_get_times (struct pex_obj *obj, int count, struct pex_time *vector)
void
pex_free (struct pex_obj *obj)
{
+ /* Close pipe file descriptors corresponding to child's stdout and
+ stderr so that the child does not hang trying to output something
+ while we're waiting for it. */
if (obj->next_input >= 0 && obj->next_input != STDIN_FILE_NO)
obj->funcs->close (obj, obj->next_input);
+ if (obj->stderr_pipe >= 0 && obj->stderr_pipe != STDIN_FILE_NO)
+ obj->funcs->close (obj, obj->stderr_pipe);
+ if (obj->read_output != NULL)
+ fclose (obj->read_output);
+ if (obj->read_err != NULL)
+ fclose (obj->read_err);
/* If the caller forgot to wait for the children, we do it here, to
avoid zombies. */
@@ -619,10 +629,6 @@ pex_free (struct pex_obj *obj)
free (obj->status);
if (obj->time != NULL)
free (obj->time);
- if (obj->read_output != NULL)
- fclose (obj->read_output);
- if (obj->read_err != NULL)
- fclose (obj->read_err);
if (obj->remove_count > 0)
{
OpenPOWER on IntegriCloud