diff options
-rw-r--r-- | gdb/ChangeLog | 11 | ||||
-rw-r--r-- | gdb/remote-fileio.c | 46 | ||||
-rw-r--r-- | gdb/remote-fileio.h | 2 | ||||
-rw-r--r-- | gdb/remote.c | 15 |
4 files changed, 57 insertions, 17 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index f689b05..714b8af 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,14 @@ +2009-11-13 Kazu Hirata <kazu@codesourcery.com> + Maxim Kuvyrkov <maxim@codesourcery.com> + + * remote-fileio.c (remote_fileio_request): Send Ctrl-C if it is + pending. + * remote-fileio.h: Update the prototype for remote_fileio_request. + * remote.c (struct remote_state): Add ctrlc_pending_p. + (remote_open_1): Clear ctrlc_pending_p. + (remote_stop_as): Set ctrlc_pending_p to 1. + (remote_wait_as): Pass ctrlc_pending_p to remote_fileio_request. + 2009-11-13 Daniel Jacobowitz <dan@codesourcery.com> * arm-tdep.c (arm_skip_stub): Recognize RealView veneer functions. diff --git a/gdb/remote-fileio.c b/gdb/remote-fileio.c index 31ee244..22311ba 100644 --- a/gdb/remote-fileio.c +++ b/gdb/remote-fileio.c @@ -1416,28 +1416,44 @@ remote_fileio_reset (void) } } +/* Handle a file I/O request. BUF points to the packet containing the + request. CTRLC_PENDING_P should be nonzero if the target has not + acknowledged the Ctrl-C sent asynchronously earlier. */ + void -remote_fileio_request (char *buf) +remote_fileio_request (char *buf, int ctrlc_pending_p) { int ex; remote_fileio_sig_init (); - remote_fio_ctrl_c_flag = 0; - remote_fio_no_longjmp = 0; - - ex = catch_exceptions (uiout, do_remote_fileio_request, (void *)buf, - RETURN_MASK_ALL); - switch (ex) + if (ctrlc_pending_p) { - case RETURN_ERROR: - remote_fileio_reply (-1, FILEIO_ENOSYS); - break; - case RETURN_QUIT: - remote_fileio_reply (-1, FILEIO_EINTR); - break; - default: - break; + /* If the target hasn't responded to the Ctrl-C sent + asynchronously earlier, take this opportunity to send the + Ctrl-C synchronously. */ + remote_fio_ctrl_c_flag = 1; + remote_fio_no_longjmp = 0; + remote_fileio_reply (-1, FILEIO_EINTR); + } + else + { + remote_fio_ctrl_c_flag = 0; + remote_fio_no_longjmp = 0; + + ex = catch_exceptions (uiout, do_remote_fileio_request, (void *)buf, + RETURN_MASK_ALL); + switch (ex) + { + case RETURN_ERROR: + remote_fileio_reply (-1, FILEIO_ENOSYS); + break; + case RETURN_QUIT: + remote_fileio_reply (-1, FILEIO_EINTR); + break; + default: + break; + } } remote_fileio_sig_exit (); diff --git a/gdb/remote-fileio.h b/gdb/remote-fileio.h index 7266e1d..82fd9c9 100644 --- a/gdb/remote-fileio.h +++ b/gdb/remote-fileio.h @@ -26,7 +26,7 @@ struct cmd_list_element; /* Unified interface to remote fileio, called in remote.c from remote_wait () and remote_async_wait () */ -extern void remote_fileio_request (char *buf); +extern void remote_fileio_request (char *buf, int ctrlc_pending_p); /* Cleanup any remote fileio state. */ extern void remote_fileio_reset (void); diff --git a/gdb/remote.c b/gdb/remote.c index 664a9c7..9fa92fb 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -297,6 +297,10 @@ struct remote_state /* True if the stub reports support for conditional tracepoints. */ int cond_tracepoints; + + /* Nonzero if the user has pressed Ctrl-C, but the target hasn't + responded to that. */ + int ctrlc_pending_p; }; /* Returns true if the multi-process extensions are in effect. */ @@ -3394,6 +3398,7 @@ remote_open_1 (char *name, int from_tty, struct target_ops *target, int extended rs->extended = extended_p; rs->non_stop_aware = 0; rs->waiting_for_stop_reply = 0; + rs->ctrlc_pending_p = 0; general_thread = not_sent_ptid; continue_thread = not_sent_ptid; @@ -4122,6 +4127,8 @@ remote_stop_as (ptid_t ptid) { struct remote_state *rs = get_remote_state (); + rs->ctrlc_pending_p = 1; + /* If the inferior is stopped already, but the core didn't know about it yet, just ignore the request. The cached wait status will be collected in remote_wait. */ @@ -4848,6 +4855,11 @@ remote_wait_as (ptid_t ptid, struct target_waitstatus *status, int options) /* We got something. */ rs->waiting_for_stop_reply = 0; + /* Assume that the target has acknowledged Ctrl-C unless we receive + an 'F' or 'O' packet. */ + if (buf[0] != 'F' && buf[0] != 'O') + rs->ctrlc_pending_p = 0; + switch (buf[0]) { case 'E': /* Error of some sort. */ @@ -4858,7 +4870,8 @@ remote_wait_as (ptid_t ptid, struct target_waitstatus *status, int options) status->value.sig = TARGET_SIGNAL_0; break; case 'F': /* File-I/O request. */ - remote_fileio_request (buf); + remote_fileio_request (buf, rs->ctrlc_pending_p); + rs->ctrlc_pending_p = 0; break; case 'T': case 'S': case 'X': case 'W': { |