| Index: gdb/ser-pipe.c
|
| diff --git a/gdb/ser-pipe.c b/gdb/ser-pipe.c
|
| index 4616a7e9abc889f432c71e145adbc7884e61f9ff..4f20cad52738b2f4bc6b9daa5435c1dc52ca4b94 100644
|
| --- a/gdb/ser-pipe.c
|
| +++ b/gdb/ser-pipe.c
|
| @@ -30,7 +30,6 @@
|
| #include <sys/time.h>
|
| #include <fcntl.h>
|
| #include "gdb_string.h"
|
| -#include "gdb_wait.h"
|
|
|
| #include <signal.h>
|
|
|
| @@ -162,14 +161,30 @@ pipe_close (struct serial *scb)
|
|
|
| if (state != NULL)
|
| {
|
| - int status;
|
| - kill (state->pid, SIGTERM);
|
| -#ifdef HAVE_WAITPID
|
| + int wait_result, status;
|
| +
|
| + /* Don't kill the task right away, give it a chance to shut down cleanly.
|
| + But don't wait forever though. */
|
| +#define PIPE_CLOSE_TIMEOUT 5
|
| +
|
| /* Assume the program will exit after SIGTERM. Might be
|
| useful to print any remaining stderr output from
|
| scb->error_fd while waiting. */
|
| - waitpid (state->pid, &status, 0);
|
| +#define SIGTERM_TIMEOUT INT_MAX
|
| +
|
| + wait_result = -1;
|
| +#ifdef HAVE_WAITPID
|
| + wait_result = wait_to_die_with_timeout (state->pid, &status,
|
| + PIPE_CLOSE_TIMEOUT);
|
| #endif
|
| + if (wait_result == -1)
|
| + {
|
| + kill (state->pid, SIGTERM);
|
| +#ifdef HAVE_WAITPID
|
| + wait_to_die_with_timeout (state->pid, &status, SIGTERM_TIMEOUT);
|
| +#endif
|
| + }
|
| +
|
| if (scb->error_fd != -1)
|
| close (scb->error_fd);
|
| scb->error_fd = -1;
|
|
|