mirror of git://gcc.gnu.org/git/gcc.git
pex-common.c (pex_read_err): Set stderr_pipe to -1 if a corresponding stream has been opened.
* 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. From-SVN: r163426
This commit is contained in:
parent
b4d456ffc0
commit
93f36faad1
|
@ -1,3 +1,10 @@
|
||||||
|
2010-08-20 Maciej W. Rozycki <macro@codesourcery.com>
|
||||||
|
|
||||||
|
* 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.
|
||||||
|
|
||||||
2010-08-13 Nick Clifton <nickc@redhat.com>
|
2010-08-13 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
* argv.c (expandargv): Limit the number of times that response
|
* argv.c (expandargv): Limit the number of times that response
|
||||||
|
|
|
@ -505,6 +505,7 @@ pex_read_err (struct pex_obj *obj, int binary)
|
||||||
if (o < 0 || o == STDIN_FILE_NO)
|
if (o < 0 || o == STDIN_FILE_NO)
|
||||||
return NULL;
|
return NULL;
|
||||||
obj->read_err = obj->funcs->fdopenr (obj, o, binary);
|
obj->read_err = obj->funcs->fdopenr (obj, o, binary);
|
||||||
|
obj->stderr_pipe = -1;
|
||||||
return obj->read_err;
|
return obj->read_err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -597,8 +598,17 @@ pex_get_times (struct pex_obj *obj, int count, struct pex_time *vector)
|
||||||
void
|
void
|
||||||
pex_free (struct pex_obj *obj)
|
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)
|
if (obj->next_input >= 0 && obj->next_input != STDIN_FILE_NO)
|
||||||
obj->funcs->close (obj, obj->next_input);
|
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
|
/* If the caller forgot to wait for the children, we do it here, to
|
||||||
avoid zombies. */
|
avoid zombies. */
|
||||||
|
@ -619,10 +629,6 @@ pex_free (struct pex_obj *obj)
|
||||||
free (obj->status);
|
free (obj->status);
|
||||||
if (obj->time != NULL)
|
if (obj->time != NULL)
|
||||||
free (obj->time);
|
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)
|
if (obj->remove_count > 0)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue