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; |