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.
This commit is contained in:
Daniel Jacobowitz
2009-11-13 22:36:30 +00:00
parent 3d8d5e79c0
commit 3a29589aa2
4 changed files with 57 additions and 17 deletions

View File

@ -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> 2009-11-13 Daniel Jacobowitz <dan@codesourcery.com>
* arm-tdep.c (arm_skip_stub): Recognize RealView veneer functions. * arm-tdep.c (arm_skip_stub): Recognize RealView veneer functions.

View File

@ -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 void
remote_fileio_request (char *buf) remote_fileio_request (char *buf, int ctrlc_pending_p)
{ {
int ex; int ex;
remote_fileio_sig_init (); remote_fileio_sig_init ();
remote_fio_ctrl_c_flag = 0; if (ctrlc_pending_p)
remote_fio_no_longjmp = 0;
ex = catch_exceptions (uiout, do_remote_fileio_request, (void *)buf,
RETURN_MASK_ALL);
switch (ex)
{ {
case RETURN_ERROR: /* If the target hasn't responded to the Ctrl-C sent
remote_fileio_reply (-1, FILEIO_ENOSYS); asynchronously earlier, take this opportunity to send the
break; Ctrl-C synchronously. */
case RETURN_QUIT: remote_fio_ctrl_c_flag = 1;
remote_fileio_reply (-1, FILEIO_EINTR); remote_fio_no_longjmp = 0;
break; remote_fileio_reply (-1, FILEIO_EINTR);
default: }
break; 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 (); remote_fileio_sig_exit ();

View File

@ -26,7 +26,7 @@ struct cmd_list_element;
/* Unified interface to remote fileio, called in remote.c from /* Unified interface to remote fileio, called in remote.c from
remote_wait () and remote_async_wait () */ 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. */ /* Cleanup any remote fileio state. */
extern void remote_fileio_reset (void); extern void remote_fileio_reset (void);

View File

@ -297,6 +297,10 @@ struct remote_state
/* True if the stub reports support for conditional tracepoints. */ /* True if the stub reports support for conditional tracepoints. */
int cond_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. */ /* 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->extended = extended_p;
rs->non_stop_aware = 0; rs->non_stop_aware = 0;
rs->waiting_for_stop_reply = 0; rs->waiting_for_stop_reply = 0;
rs->ctrlc_pending_p = 0;
general_thread = not_sent_ptid; general_thread = not_sent_ptid;
continue_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 (); struct remote_state *rs = get_remote_state ();
rs->ctrlc_pending_p = 1;
/* If the inferior is stopped already, but the core didn't know /* If the inferior is stopped already, but the core didn't know
about it yet, just ignore the request. The cached wait status about it yet, just ignore the request. The cached wait status
will be collected in remote_wait. */ 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. */ /* We got something. */
rs->waiting_for_stop_reply = 0; 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]) switch (buf[0])
{ {
case 'E': /* Error of some sort. */ 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; status->value.sig = TARGET_SIGNAL_0;
break; break;
case 'F': /* File-I/O request. */ case 'F': /* File-I/O request. */
remote_fileio_request (buf); remote_fileio_request (buf, rs->ctrlc_pending_p);
rs->ctrlc_pending_p = 0;
break; break;
case 'T': case 'S': case 'X': case 'W': case 'T': case 'S': case 'X': case 'W':
{ {