| OLD | NEW |
| 1 /* Serial interface for a pipe to a separate program | 1 /* Serial interface for a pipe to a separate program |
| 2 Copyright (C) 1999-2001, 2007-2012 Free Software Foundation, Inc. | 2 Copyright (C) 1999-2001, 2007-2012 Free Software Foundation, Inc. |
| 3 | 3 |
| 4 Contributed by Cygnus Solutions. | 4 Contributed by Cygnus Solutions. |
| 5 | 5 |
| 6 This file is part of GDB. | 6 This file is part of GDB. |
| 7 | 7 |
| 8 This program is free software; you can redistribute it and/or modify | 8 This program is free software; you can redistribute it and/or modify |
| 9 it under the terms of the GNU General Public License as published by | 9 it under the terms of the GNU General Public License as published by |
| 10 the Free Software Foundation; either version 3 of the License, or | 10 the Free Software Foundation; either version 3 of the License, or |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 #include "ser-base.h" | 23 #include "ser-base.h" |
| 24 #include "ser-unix.h" | 24 #include "ser-unix.h" |
| 25 | 25 |
| 26 #include "gdb_vfork.h" | 26 #include "gdb_vfork.h" |
| 27 | 27 |
| 28 #include <sys/types.h> | 28 #include <sys/types.h> |
| 29 #include <sys/socket.h> | 29 #include <sys/socket.h> |
| 30 #include <sys/time.h> | 30 #include <sys/time.h> |
| 31 #include <fcntl.h> | 31 #include <fcntl.h> |
| 32 #include "gdb_string.h" | 32 #include "gdb_string.h" |
| 33 #include "gdb_wait.h" | |
| 34 | 33 |
| 35 #include <signal.h> | 34 #include <signal.h> |
| 36 | 35 |
| 37 static int pipe_open (struct serial *scb, const char *name); | 36 static int pipe_open (struct serial *scb, const char *name); |
| 38 static void pipe_close (struct serial *scb); | 37 static void pipe_close (struct serial *scb); |
| 39 | 38 |
| 40 extern void _initialize_ser_pipe (void); | 39 extern void _initialize_ser_pipe (void); |
| 41 | 40 |
| 42 struct pipe_state | 41 struct pipe_state |
| 43 { | 42 { |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 155 static void | 154 static void |
| 156 pipe_close (struct serial *scb) | 155 pipe_close (struct serial *scb) |
| 157 { | 156 { |
| 158 struct pipe_state *state = scb->state; | 157 struct pipe_state *state = scb->state; |
| 159 | 158 |
| 160 close (scb->fd); | 159 close (scb->fd); |
| 161 scb->fd = -1; | 160 scb->fd = -1; |
| 162 | 161 |
| 163 if (state != NULL) | 162 if (state != NULL) |
| 164 { | 163 { |
| 165 int status; | 164 int wait_result, status; |
| 166 kill (state->pid, SIGTERM); | 165 |
| 167 #ifdef HAVE_WAITPID | 166 /* Don't kill the task right away, give it a chance to shut down cleanly. |
| 167 » But don't wait forever though. */ |
| 168 #define PIPE_CLOSE_TIMEOUT 5 |
| 169 |
| 168 /* Assume the program will exit after SIGTERM. Might be | 170 /* Assume the program will exit after SIGTERM. Might be |
| 169 useful to print any remaining stderr output from | 171 useful to print any remaining stderr output from |
| 170 scb->error_fd while waiting. */ | 172 scb->error_fd while waiting. */ |
| 171 waitpid (state->pid, &status, 0); | 173 #define SIGTERM_TIMEOUT INT_MAX |
| 174 |
| 175 wait_result = -1; |
| 176 #ifdef HAVE_WAITPID |
| 177 wait_result = wait_to_die_with_timeout (state->pid, &status, |
| 178 » » » » » PIPE_CLOSE_TIMEOUT); |
| 172 #endif | 179 #endif |
| 180 if (wait_result == -1) |
| 181 { |
| 182 kill (state->pid, SIGTERM); |
| 183 #ifdef HAVE_WAITPID |
| 184 wait_to_die_with_timeout (state->pid, &status, SIGTERM_TIMEOUT); |
| 185 #endif |
| 186 } |
| 187 |
| 173 if (scb->error_fd != -1) | 188 if (scb->error_fd != -1) |
| 174 close (scb->error_fd); | 189 close (scb->error_fd); |
| 175 scb->error_fd = -1; | 190 scb->error_fd = -1; |
| 176 xfree (state); | 191 xfree (state); |
| 177 scb->state = NULL; | 192 scb->state = NULL; |
| 178 } | 193 } |
| 179 } | 194 } |
| 180 | 195 |
| 181 int | 196 int |
| 182 gdb_pipe (int pdes[2]) | 197 gdb_pipe (int pdes[2]) |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 218 ops->print_tty_state = ser_base_print_tty_state; | 233 ops->print_tty_state = ser_base_print_tty_state; |
| 219 ops->noflush_set_tty_state = ser_base_noflush_set_tty_state; | 234 ops->noflush_set_tty_state = ser_base_noflush_set_tty_state; |
| 220 ops->setbaudrate = ser_base_setbaudrate; | 235 ops->setbaudrate = ser_base_setbaudrate; |
| 221 ops->setstopbits = ser_base_setstopbits; | 236 ops->setstopbits = ser_base_setstopbits; |
| 222 ops->drain_output = ser_base_drain_output; | 237 ops->drain_output = ser_base_drain_output; |
| 223 ops->async = ser_base_async; | 238 ops->async = ser_base_async; |
| 224 ops->read_prim = ser_unix_read_prim; | 239 ops->read_prim = ser_unix_read_prim; |
| 225 ops->write_prim = ser_unix_write_prim; | 240 ops->write_prim = ser_unix_write_prim; |
| 226 serial_add_interface (ops); | 241 serial_add_interface (ops); |
| 227 } | 242 } |
| OLD | NEW |