remote: one struct remote_state per struct remote_target

'struct remote_state' today contains per-connection state, however
there's only a single global instance of that type.  In order to
support multiple connections, we must have one such object per
connection.

Thus this patch eliminates the 'remote_state' global in favor of
having a remote_state instance per remote_target instance.

The get_remote_state free function is eliminated as well, by making it
a remote_target method instead.

The patch then fixes the fallout by making all free functions that
refer to get_remote_state() directly or indirectly be methods of
remote_target too.

Likewise, remote-fileio.c and remote-notif.c routines are
parameterized with a remote_target pointer too, so they can call into
the right remote_target instance.

References to the global 'get_remote_state ()->remote_desc' to tell
whether the remote target is open (!= nullptr) must be replaced with
something else:

 - Command implementations use a new get_current_remote_target free
 function.

 - remote_target::open_1 checks the exception type instead.

Finally, remote_target and extended_remote_target are made
heap-allocated targets.  As with the earlier core target patches, it
still won't be possible to have more than one remote_target instance
in practice, but this puts us closer.

gdb/ChangeLog:
2018-05-22  Pedro Alves  <palves@redhat.com>

	* remote-fileio.c (remote_fileio_reply, remote_fileio_ioerror)
	(remote_fileio_badfd, remote_fileio_return_errno)
	(remote_fileio_return_success, remote_fileio_func_open)
	(remote_fileio_func_open, remote_fileio_func_close)
	(remote_fileio_func_read, remote_fileio_func_write)
	(remote_fileio_func_lseek, remote_fileio_func_rename)
	(remote_fileio_func_unlink, remote_fileio_func_stat)
	(remote_fileio_func_fstat, remote_fileio_func_gettimeofday)
	(remote_fileio_func_isatty, remote_fileio_func_system): Add
	remote_target parameter.
	(remote_fio_func_map) <func>: Add remote_target parameter.
	(do_remote_fileio_request, remote_fileio_request):
	* remote-fileio.h (remote_fileio_request):
	* remote-notif.c (remote_notif_ack, remote_notif_parse, ): Add
	remote_target parameter.
	(remote_notif_process, handle_notification): Adjust to pass down
	the remote.
	(remote_notif_state_allocate): Add remote_target parameter.  Save
	it.
	* remote-notif.h (struct remote_target): Forward declare.
	(struct notif_client) <parse, ack, can_get_pending_events>: Add
	remote_target parameter.
	(struct remote_notif_state) <remote>: New field.
	(remote_notif_ack, remote_notif_parse): Add remote_target
	parameter.
	(remote_notif_state_allocate, remote_notif_state_allocate): Add
	remote_target parameter.
	* remote.c (OPAQUETHREADBYTES, threadref, gdb_ext_thread_info)
	(threads_listing_context, rmt_thread_action, protocol_feature)
	(packet_reg, stop_reply, stop_reply_p, enum packet_support)
	(packet_result, struct threads_listing_context, remote_state):
	Move definitions and declarations higher up.
	(remote_target) <~remote_target>: Declare.
	(remote_download_command_source, remote_file_put, remote_file_get)
	(remote_file_delete, remote_hostio_pread, remote_hostio_pwrite)
	(remote_hostio_pread_vFile, remote_hostio_send_command)
	(remote_hostio_set_filesystem, remote_hostio_open)
	(remote_hostio_close, remote_hostio_unlink, remote_state)
	(get_remote_state, get_remote_packet_size, get_memory_packet_size)
	(get_memory_write_packet_size, get_memory_read_packet_size)
	(append_pending_thread_resumptions, remote_detach_1)
	(append_resumption, remote_resume_with_vcont)
	(add_current_inferior_and_thread, wait_ns, wait_as)
	(process_stop_reply, remote_notice_new_inferior)
	(process_initial_stop_replies, remote_add_thread)
	(btrace_sync_conf, remote_btrace_maybe_reopen)
	(remove_new_fork_children, kill_new_fork_children)
	(discard_pending_stop_replies, stop_reply_queue_length)
	(check_pending_events_prevent_wildcard_vcont)
	(discard_pending_stop_replies_in_queue, stop_reply)
	(remote_notif_remove_queued_reply, stop_reply *queued_stop_reply)
	(peek_stop_reply, remote_parse_stop_reply, remote_stop_ns)
	(remote_interrupt_as, remote_interrupt_ns)
	(remote_get_noisy_reply, remote_query_attached)
	(remote_add_inferior, remote_current_thread, get_current_thread)
	(set_thread, set_general_thread, set_continue_thread)
	(set_general_process, write_ptid)
	(remote_unpack_thread_info_response, remote_get_threadinfo)
	(parse_threadlist_response, remote_get_threadlist)
	(remote_threadlist_iterator, remote_get_threads_with_ql)
	(remote_get_threads_with_qxfer)
	(remote_get_threads_with_qthreadinfo, extended_remote_restart)
	(get_offsets, remote_check_symbols, remote_supported_packet)
	(remote_query_supported, remote_packet_size)
	(remote_serial_quit_handler, remote_detach_pid)
	(remote_vcont_probe, remote_resume_with_hc)
	(send_interrupt_sequence, interrupt_query)
	(remote_notif_get_pending_events, fetch_register_using_p)
	(send_g_packet, process_g_packet, fetch_registers_using_g)
	(store_register_using_P, store_registers_using_G)
	(set_remote_traceframe, check_binary_download)
	(remote_write_bytes_aux, remote_write_bytes, remote_read_bytes_1)
	(remote_xfer_live_readonly_partial, remote_read_bytes)
	(remote_send_printf, remote_flash_write, readchar)
	(remote_serial_write, putpkt, putpkt_binary, skip_frame)
	(read_frame, getpkt, getpkt_or_notif_sane_1, getpkt_sane)
	(getpkt_or_notif_sane, remote_vkill, remote_kill_k)
	(extended_remote_disable_randomization, extended_remote_run)
	(send_environment_packet, extended_remote_environment_support)
	(extended_remote_set_inferior_cwd, remote_write_qxfer)
	(remote_read_qxfer, push_stop_reply, vcont_r_supported)
	(packet_command): Now methods of ...
	(remote_target): ... this class.
	(m_remote_state) <remote_target>: New field.
	(struct remote_state) <stop_reply_queue,
	remote_async_inferior_event_token, wait_forever_enabled_p>: New
	fields.
	(remote_state::remote_state): Allocate stop_reply_queue.
	(remote_state): Delete global.
	(get_remote_state_raw): Delete.
	(remote_target::get_remote_state): Allocate m_remote_state on
	demand.
	(get_current_remote_target): New.
	(remote_ops, extended_remote_ops): Delete.
	(wait_forever_enabled_p, remote_async_inferior_event_token):
	Delete, moved to struct remote_state.
	(remote_target::close): Delete self.  Destruction bits split to
	...
	(remote_target::~remote_target): ... this.
	(show_memory_packet_size): Adjust to use
	get_current_remote_target.
	(struct protocol_feature) <func>: Add remote_target parameter.
	All callers adjusted.
	(curr_quit_handler_target): New.
	(remote_serial_quit_handler): Reimplement.
	(remote_target::open_1): Adjust to use get_current_remote_target.
	Heap-allocate remote_target/extended_remote_target instances.
	(vcont_builder::vcont_builder): Add remote_target parameter, and
	save it in m_remote.  All callers adjusted.
	(vcont_builder::m_remote): New field.
	(vcont_builder::restart, vcont_builder::flush)
	(vcont_builder::push_action): Use it.
	(remote_target::commit_resume): Use it.
	(struct queue_iter_param) <remote>: New field.
	(remote_target::remove_new_fork_children): Fill in 'remote' field.
	(check_pending_event_prevents_wildcard_vcont_callback_data): New.
	(check_pending_event_prevents_wildcard_vcont_callback)
	(remote_target::check_pending_events_prevent_wildcard_vcont)
	(remote_target::discard_pending_stop_replies)
	(remote_target::discard_pending_stop_replies_in_queue)
	(remote_target::remote_notif_remove_queued_reply): Fill in
	'remote' field.
	(remote_notif_get_pending_events): New.
	(remote_target::readchar, remote_target::remote_serial_write):
	Save/restore curr_quit_handler_target.
	(putpkt): New.
	(kill_new_fork_children): Fill in 'remote' field.
	(packet_command): Use get_current_remote_target, defer to
	remote_target method of same name.
	(scoped_remote_fd::scoped_remote_fd): Add 'remote_target'
	parameter, and save it in m_remote.  All callers adjusted.
	(scoped_remote_fd::release): Use m_remote.
	(scoped_remote_fd::m_remote): New field.
	(remote_file_put, remote_file_get, remote_file_delete): Use
	get_current_remote_target, defer to remote_target method of same
	name.
	(remote_btrace_reset): Add remote_state paremeter.  Update all
	callers.
	(remote_async_inferior_event_handler). Pass down 'data'.
	(remote_new_objfile): Use get_current_remote_target.
	(remote_target::vcont_r_supported): New.
	(set_range_stepping): Use get_current_remote_target and
	remote_target::vcont_r_supported.
	(_initialize_remote): Don't allocate 'remote_state' and
	'stop_reply_queue' globals.
	* remote.h (struct remote_target): Forward declare.
	(getpkt, putpkt, remote_notif_get_pending_events): Add
	'remote_target' parameter.
This commit is contained in:
Pedro Alves 2018-05-22 18:22:11 +01:00
parent f5db4863f5
commit 6b8edb5101
7 changed files with 1212 additions and 744 deletions

View file

@ -1,3 +1,154 @@
2018-05-22 Pedro Alves <palves@redhat.com>
* remote-fileio.c (remote_fileio_reply, remote_fileio_ioerror)
(remote_fileio_badfd, remote_fileio_return_errno)
(remote_fileio_return_success, remote_fileio_func_open)
(remote_fileio_func_open, remote_fileio_func_close)
(remote_fileio_func_read, remote_fileio_func_write)
(remote_fileio_func_lseek, remote_fileio_func_rename)
(remote_fileio_func_unlink, remote_fileio_func_stat)
(remote_fileio_func_fstat, remote_fileio_func_gettimeofday)
(remote_fileio_func_isatty, remote_fileio_func_system): Add
remote_target parameter.
(remote_fio_func_map) <func>: Add remote_target parameter.
(do_remote_fileio_request, remote_fileio_request):
* remote-fileio.h (remote_fileio_request):
* remote-notif.c (remote_notif_ack, remote_notif_parse, ): Add
remote_target parameter.
(remote_notif_process, handle_notification): Adjust to pass down
the remote.
(remote_notif_state_allocate): Add remote_target parameter. Save
it.
* remote-notif.h (struct remote_target): Forward declare.
(struct notif_client) <parse, ack, can_get_pending_events>: Add
remote_target parameter.
(struct remote_notif_state) <remote>: New field.
(remote_notif_ack, remote_notif_parse): Add remote_target
parameter.
(remote_notif_state_allocate, remote_notif_state_allocate): Add
remote_target parameter.
* remote.c (OPAQUETHREADBYTES, threadref, gdb_ext_thread_info)
(threads_listing_context, rmt_thread_action, protocol_feature)
(packet_reg, stop_reply, stop_reply_p, enum packet_support)
(packet_result, struct threads_listing_context, remote_state):
Move definitions and declarations higher up.
(remote_target) <~remote_target>: Declare.
(remote_download_command_source, remote_file_put, remote_file_get)
(remote_file_delete, remote_hostio_pread, remote_hostio_pwrite)
(remote_hostio_pread_vFile, remote_hostio_send_command)
(remote_hostio_set_filesystem, remote_hostio_open)
(remote_hostio_close, remote_hostio_unlink, remote_state)
(get_remote_state, get_remote_packet_size, get_memory_packet_size)
(get_memory_write_packet_size, get_memory_read_packet_size)
(append_pending_thread_resumptions, remote_detach_1)
(append_resumption, remote_resume_with_vcont)
(add_current_inferior_and_thread, wait_ns, wait_as)
(process_stop_reply, remote_notice_new_inferior)
(process_initial_stop_replies, remote_add_thread)
(btrace_sync_conf, remote_btrace_maybe_reopen)
(remove_new_fork_children, kill_new_fork_children)
(discard_pending_stop_replies, stop_reply_queue_length)
(check_pending_events_prevent_wildcard_vcont)
(discard_pending_stop_replies_in_queue, stop_reply)
(remote_notif_remove_queued_reply, stop_reply *queued_stop_reply)
(peek_stop_reply, remote_parse_stop_reply, remote_stop_ns)
(remote_interrupt_as, remote_interrupt_ns)
(remote_get_noisy_reply, remote_query_attached)
(remote_add_inferior, remote_current_thread, get_current_thread)
(set_thread, set_general_thread, set_continue_thread)
(set_general_process, write_ptid)
(remote_unpack_thread_info_response, remote_get_threadinfo)
(parse_threadlist_response, remote_get_threadlist)
(remote_threadlist_iterator, remote_get_threads_with_ql)
(remote_get_threads_with_qxfer)
(remote_get_threads_with_qthreadinfo, extended_remote_restart)
(get_offsets, remote_check_symbols, remote_supported_packet)
(remote_query_supported, remote_packet_size)
(remote_serial_quit_handler, remote_detach_pid)
(remote_vcont_probe, remote_resume_with_hc)
(send_interrupt_sequence, interrupt_query)
(remote_notif_get_pending_events, fetch_register_using_p)
(send_g_packet, process_g_packet, fetch_registers_using_g)
(store_register_using_P, store_registers_using_G)
(set_remote_traceframe, check_binary_download)
(remote_write_bytes_aux, remote_write_bytes, remote_read_bytes_1)
(remote_xfer_live_readonly_partial, remote_read_bytes)
(remote_send_printf, remote_flash_write, readchar)
(remote_serial_write, putpkt, putpkt_binary, skip_frame)
(read_frame, getpkt, getpkt_or_notif_sane_1, getpkt_sane)
(getpkt_or_notif_sane, remote_vkill, remote_kill_k)
(extended_remote_disable_randomization, extended_remote_run)
(send_environment_packet, extended_remote_environment_support)
(extended_remote_set_inferior_cwd, remote_write_qxfer)
(remote_read_qxfer, push_stop_reply, vcont_r_supported)
(packet_command): Now methods of ...
(remote_target): ... this class.
(m_remote_state) <remote_target>: New field.
(struct remote_state) <stop_reply_queue,
remote_async_inferior_event_token, wait_forever_enabled_p>: New
fields.
(remote_state::remote_state): Allocate stop_reply_queue.
(remote_state): Delete global.
(get_remote_state_raw): Delete.
(remote_target::get_remote_state): Allocate m_remote_state on
demand.
(get_current_remote_target): New.
(remote_ops, extended_remote_ops): Delete.
(wait_forever_enabled_p, remote_async_inferior_event_token):
Delete, moved to struct remote_state.
(remote_target::close): Delete self. Destruction bits split to
...
(remote_target::~remote_target): ... this.
(show_memory_packet_size): Adjust to use
get_current_remote_target.
(struct protocol_feature) <func>: Add remote_target parameter.
All callers adjusted.
(curr_quit_handler_target): New.
(remote_serial_quit_handler): Reimplement.
(remote_target::open_1): Adjust to use get_current_remote_target.
Heap-allocate remote_target/extended_remote_target instances.
(vcont_builder::vcont_builder): Add remote_target parameter, and
save it in m_remote. All callers adjusted.
(vcont_builder::m_remote): New field.
(vcont_builder::restart, vcont_builder::flush)
(vcont_builder::push_action): Use it.
(remote_target::commit_resume): Use it.
(struct queue_iter_param) <remote>: New field.
(remote_target::remove_new_fork_children): Fill in 'remote' field.
(check_pending_event_prevents_wildcard_vcont_callback_data): New.
(check_pending_event_prevents_wildcard_vcont_callback)
(remote_target::check_pending_events_prevent_wildcard_vcont)
(remote_target::discard_pending_stop_replies)
(remote_target::discard_pending_stop_replies_in_queue)
(remote_target::remote_notif_remove_queued_reply): Fill in
'remote' field.
(remote_notif_get_pending_events): New.
(remote_target::readchar, remote_target::remote_serial_write):
Save/restore curr_quit_handler_target.
(putpkt): New.
(kill_new_fork_children): Fill in 'remote' field.
(packet_command): Use get_current_remote_target, defer to
remote_target method of same name.
(scoped_remote_fd::scoped_remote_fd): Add 'remote_target'
parameter, and save it in m_remote. All callers adjusted.
(scoped_remote_fd::release): Use m_remote.
(scoped_remote_fd::m_remote): New field.
(remote_file_put, remote_file_get, remote_file_delete): Use
get_current_remote_target, defer to remote_target method of same
name.
(remote_btrace_reset): Add remote_state paremeter. Update all
callers.
(remote_async_inferior_event_handler). Pass down 'data'.
(remote_new_objfile): Use get_current_remote_target.
(remote_target::vcont_r_supported): New.
(set_range_stepping): Use get_current_remote_target and
remote_target::vcont_r_supported.
(_initialize_remote): Don't allocate 'remote_state' and
'stop_reply_queue' globals.
* remote.h (struct remote_target): Forward declare.
(getpkt, putpkt, remote_notif_get_pending_events): Add
'remote_target' parameter.
2018-05-22 Pedro Alves <palves@redhat.com> 2018-05-22 Pedro Alves <palves@redhat.com>
* remote.c (vcont_builder): Now a class. Make all data members * remote.c (vcont_builder): Now a class. Make all data members

View file

@ -313,7 +313,7 @@ remote_fileio_quit_handler (void)
} }
static void static void
remote_fileio_reply (int retcode, int error) remote_fileio_reply (remote_target *remote, int retcode, int error)
{ {
char buf[32]; char buf[32];
int ctrl_c = check_quit_flag (); int ctrl_c = check_quit_flag ();
@ -339,36 +339,36 @@ remote_fileio_reply (int retcode, int error)
strcat (buf, ",C"); strcat (buf, ",C");
} }
quit_handler = remote_fileio_o_quit_handler; quit_handler = remote_fileio_o_quit_handler;
putpkt (buf); putpkt (remote, buf);
} }
static void static void
remote_fileio_ioerror (void) remote_fileio_ioerror (remote_target *remote)
{ {
remote_fileio_reply (-1, FILEIO_EIO); remote_fileio_reply (remote, -1, FILEIO_EIO);
} }
static void static void
remote_fileio_badfd (void) remote_fileio_badfd (remote_target *remote)
{ {
remote_fileio_reply (-1, FILEIO_EBADF); remote_fileio_reply (remote, -1, FILEIO_EBADF);
} }
static void static void
remote_fileio_return_errno (int retcode) remote_fileio_return_errno (remote_target *remote, int retcode)
{ {
remote_fileio_reply (retcode, retcode < 0 remote_fileio_reply (remote, retcode, retcode < 0
? host_to_fileio_error (errno) : 0); ? host_to_fileio_error (errno) : 0);
} }
static void static void
remote_fileio_return_success (int retcode) remote_fileio_return_success (remote_target *remote, int retcode)
{ {
remote_fileio_reply (retcode, 0); remote_fileio_reply (remote, retcode, 0);
} }
static void static void
remote_fileio_func_open (char *buf) remote_fileio_func_open (remote_target *remote, char *buf)
{ {
CORE_ADDR ptrval; CORE_ADDR ptrval;
int length; int length;
@ -381,20 +381,20 @@ remote_fileio_func_open (char *buf)
/* 1. Parameter: Ptr to pathname / length incl. trailing zero. */ /* 1. Parameter: Ptr to pathname / length incl. trailing zero. */
if (remote_fileio_extract_ptr_w_len (&buf, &ptrval, &length)) if (remote_fileio_extract_ptr_w_len (&buf, &ptrval, &length))
{ {
remote_fileio_ioerror (); remote_fileio_ioerror (remote);
return; return;
} }
/* 2. Parameter: open flags */ /* 2. Parameter: open flags */
if (remote_fileio_extract_int (&buf, &num)) if (remote_fileio_extract_int (&buf, &num))
{ {
remote_fileio_ioerror (); remote_fileio_ioerror (remote);
return; return;
} }
flags = remote_fileio_oflags_to_host (num); flags = remote_fileio_oflags_to_host (num);
/* 3. Parameter: open mode */ /* 3. Parameter: open mode */
if (remote_fileio_extract_int (&buf, &num)) if (remote_fileio_extract_int (&buf, &num))
{ {
remote_fileio_ioerror (); remote_fileio_ioerror (remote);
return; return;
} }
mode = remote_fileio_mode_to_host (num, 1); mode = remote_fileio_mode_to_host (num, 1);
@ -403,7 +403,7 @@ remote_fileio_func_open (char *buf)
pathname = (char *) alloca (length); pathname = (char *) alloca (length);
if (target_read_memory (ptrval, (gdb_byte *) pathname, length) != 0) if (target_read_memory (ptrval, (gdb_byte *) pathname, length) != 0)
{ {
remote_fileio_ioerror (); remote_fileio_ioerror (remote);
return; return;
} }
@ -414,13 +414,13 @@ remote_fileio_func_open (char *buf)
{ {
if (!S_ISREG (st.st_mode) && !S_ISDIR (st.st_mode)) if (!S_ISREG (st.st_mode) && !S_ISDIR (st.st_mode))
{ {
remote_fileio_reply (-1, FILEIO_ENODEV); remote_fileio_reply (remote, -1, FILEIO_ENODEV);
return; return;
} }
if (S_ISDIR (st.st_mode) if (S_ISDIR (st.st_mode)
&& ((flags & O_WRONLY) == O_WRONLY || (flags & O_RDWR) == O_RDWR)) && ((flags & O_WRONLY) == O_WRONLY || (flags & O_RDWR) == O_RDWR))
{ {
remote_fileio_reply (-1, FILEIO_EISDIR); remote_fileio_reply (remote, -1, FILEIO_EISDIR);
return; return;
} }
} }
@ -428,16 +428,16 @@ remote_fileio_func_open (char *buf)
fd = gdb_open_cloexec (pathname, flags, mode); fd = gdb_open_cloexec (pathname, flags, mode);
if (fd < 0) if (fd < 0)
{ {
remote_fileio_return_errno (-1); remote_fileio_return_errno (remote, -1);
return; return;
} }
fd = remote_fileio_fd_to_targetfd (fd); fd = remote_fileio_fd_to_targetfd (fd);
remote_fileio_return_success (fd); remote_fileio_return_success (remote, fd);
} }
static void static void
remote_fileio_func_close (char *buf) remote_fileio_func_close (remote_target *remote, char *buf)
{ {
long num; long num;
int fd; int fd;
@ -445,24 +445,24 @@ remote_fileio_func_close (char *buf)
/* Parameter: file descriptor */ /* Parameter: file descriptor */
if (remote_fileio_extract_int (&buf, &num)) if (remote_fileio_extract_int (&buf, &num))
{ {
remote_fileio_ioerror (); remote_fileio_ioerror (remote);
return; return;
} }
fd = remote_fileio_map_fd ((int) num); fd = remote_fileio_map_fd ((int) num);
if (fd == FIO_FD_INVALID) if (fd == FIO_FD_INVALID)
{ {
remote_fileio_badfd (); remote_fileio_badfd (remote);
return; return;
} }
if (fd != FIO_FD_CONSOLE_IN && fd != FIO_FD_CONSOLE_OUT && close (fd)) if (fd != FIO_FD_CONSOLE_IN && fd != FIO_FD_CONSOLE_OUT && close (fd))
remote_fileio_return_errno (-1); remote_fileio_return_errno (remote, -1);
remote_fileio_close_target_fd ((int) num); remote_fileio_close_target_fd ((int) num);
remote_fileio_return_success (0); remote_fileio_return_success (remote, 0);
} }
static void static void
remote_fileio_func_read (char *buf) remote_fileio_func_read (remote_target *remote, char *buf)
{ {
long target_fd, num; long target_fd, num;
LONGEST lnum; LONGEST lnum;
@ -475,26 +475,26 @@ remote_fileio_func_read (char *buf)
/* 1. Parameter: file descriptor */ /* 1. Parameter: file descriptor */
if (remote_fileio_extract_int (&buf, &target_fd)) if (remote_fileio_extract_int (&buf, &target_fd))
{ {
remote_fileio_ioerror (); remote_fileio_ioerror (remote);
return; return;
} }
fd = remote_fileio_map_fd ((int) target_fd); fd = remote_fileio_map_fd ((int) target_fd);
if (fd == FIO_FD_INVALID) if (fd == FIO_FD_INVALID)
{ {
remote_fileio_badfd (); remote_fileio_badfd (remote);
return; return;
} }
/* 2. Parameter: buffer pointer */ /* 2. Parameter: buffer pointer */
if (remote_fileio_extract_long (&buf, &lnum)) if (remote_fileio_extract_long (&buf, &lnum))
{ {
remote_fileio_ioerror (); remote_fileio_ioerror (remote);
return; return;
} }
ptrval = (CORE_ADDR) lnum; ptrval = (CORE_ADDR) lnum;
/* 3. Parameter: buffer length */ /* 3. Parameter: buffer length */
if (remote_fileio_extract_int (&buf, &num)) if (remote_fileio_extract_int (&buf, &num))
{ {
remote_fileio_ioerror (); remote_fileio_ioerror (remote);
return; return;
} }
length = (size_t) num; length = (size_t) num;
@ -502,7 +502,7 @@ remote_fileio_func_read (char *buf)
switch (fd) switch (fd)
{ {
case FIO_FD_CONSOLE_OUT: case FIO_FD_CONSOLE_OUT:
remote_fileio_badfd (); remote_fileio_badfd (remote);
return; return;
case FIO_FD_CONSOLE_IN: case FIO_FD_CONSOLE_IN:
{ {
@ -580,15 +580,15 @@ remote_fileio_func_read (char *buf)
} }
if (ret < 0) if (ret < 0)
remote_fileio_return_errno (-1); remote_fileio_return_errno (remote, -1);
else else
remote_fileio_return_success (ret); remote_fileio_return_success (remote, ret);
xfree (buffer); xfree (buffer);
} }
static void static void
remote_fileio_func_write (char *buf) remote_fileio_func_write (remote_target *remote, char *buf)
{ {
long target_fd, num; long target_fd, num;
LONGEST lnum; LONGEST lnum;
@ -600,26 +600,26 @@ remote_fileio_func_write (char *buf)
/* 1. Parameter: file descriptor */ /* 1. Parameter: file descriptor */
if (remote_fileio_extract_int (&buf, &target_fd)) if (remote_fileio_extract_int (&buf, &target_fd))
{ {
remote_fileio_ioerror (); remote_fileio_ioerror (remote);
return; return;
} }
fd = remote_fileio_map_fd ((int) target_fd); fd = remote_fileio_map_fd ((int) target_fd);
if (fd == FIO_FD_INVALID) if (fd == FIO_FD_INVALID)
{ {
remote_fileio_badfd (); remote_fileio_badfd (remote);
return; return;
} }
/* 2. Parameter: buffer pointer */ /* 2. Parameter: buffer pointer */
if (remote_fileio_extract_long (&buf, &lnum)) if (remote_fileio_extract_long (&buf, &lnum))
{ {
remote_fileio_ioerror (); remote_fileio_ioerror (remote);
return; return;
} }
ptrval = (CORE_ADDR) lnum; ptrval = (CORE_ADDR) lnum;
/* 3. Parameter: buffer length */ /* 3. Parameter: buffer length */
if (remote_fileio_extract_int (&buf, &num)) if (remote_fileio_extract_int (&buf, &num))
{ {
remote_fileio_ioerror (); remote_fileio_ioerror (remote);
return; return;
} }
length = (size_t) num; length = (size_t) num;
@ -628,14 +628,14 @@ remote_fileio_func_write (char *buf)
if (target_read_memory (ptrval, buffer, length) != 0) if (target_read_memory (ptrval, buffer, length) != 0)
{ {
xfree (buffer); xfree (buffer);
remote_fileio_ioerror (); remote_fileio_ioerror (remote);
return; return;
} }
switch (fd) switch (fd)
{ {
case FIO_FD_CONSOLE_IN: case FIO_FD_CONSOLE_IN:
remote_fileio_badfd (); remote_fileio_badfd (remote);
xfree (buffer); xfree (buffer);
return; return;
case FIO_FD_CONSOLE_OUT: case FIO_FD_CONSOLE_OUT:
@ -653,15 +653,15 @@ remote_fileio_func_write (char *buf)
} }
if (ret < 0) if (ret < 0)
remote_fileio_return_errno (-1); remote_fileio_return_errno (remote, -1);
else else
remote_fileio_return_success (ret); remote_fileio_return_success (remote, ret);
xfree (buffer); xfree (buffer);
} }
static void static void
remote_fileio_func_lseek (char *buf) remote_fileio_func_lseek (remote_target *remote, char *buf)
{ {
long num; long num;
LONGEST lnum; LONGEST lnum;
@ -671,50 +671,50 @@ remote_fileio_func_lseek (char *buf)
/* 1. Parameter: file descriptor */ /* 1. Parameter: file descriptor */
if (remote_fileio_extract_int (&buf, &num)) if (remote_fileio_extract_int (&buf, &num))
{ {
remote_fileio_ioerror (); remote_fileio_ioerror (remote);
return; return;
} }
fd = remote_fileio_map_fd ((int) num); fd = remote_fileio_map_fd ((int) num);
if (fd == FIO_FD_INVALID) if (fd == FIO_FD_INVALID)
{ {
remote_fileio_badfd (); remote_fileio_badfd (remote);
return; return;
} }
else if (fd == FIO_FD_CONSOLE_IN || fd == FIO_FD_CONSOLE_OUT) else if (fd == FIO_FD_CONSOLE_IN || fd == FIO_FD_CONSOLE_OUT)
{ {
remote_fileio_reply (-1, FILEIO_ESPIPE); remote_fileio_reply (remote, -1, FILEIO_ESPIPE);
return; return;
} }
/* 2. Parameter: offset */ /* 2. Parameter: offset */
if (remote_fileio_extract_long (&buf, &lnum)) if (remote_fileio_extract_long (&buf, &lnum))
{ {
remote_fileio_ioerror (); remote_fileio_ioerror (remote);
return; return;
} }
offset = (off_t) lnum; offset = (off_t) lnum;
/* 3. Parameter: flag */ /* 3. Parameter: flag */
if (remote_fileio_extract_int (&buf, &num)) if (remote_fileio_extract_int (&buf, &num))
{ {
remote_fileio_ioerror (); remote_fileio_ioerror (remote);
return; return;
} }
if (remote_fileio_seek_flag_to_host (num, &flag)) if (remote_fileio_seek_flag_to_host (num, &flag))
{ {
remote_fileio_reply (-1, FILEIO_EINVAL); remote_fileio_reply (remote, -1, FILEIO_EINVAL);
return; return;
} }
ret = lseek (fd, offset, flag); ret = lseek (fd, offset, flag);
if (ret == (off_t) -1) if (ret == (off_t) -1)
remote_fileio_return_errno (-1); remote_fileio_return_errno (remote, -1);
else else
remote_fileio_return_success (ret); remote_fileio_return_success (remote, ret);
} }
static void static void
remote_fileio_func_rename (char *buf) remote_fileio_func_rename (remote_target *remote, char *buf)
{ {
CORE_ADDR old_ptr, new_ptr; CORE_ADDR old_ptr, new_ptr;
int old_len, new_len; int old_len, new_len;
@ -725,14 +725,14 @@ remote_fileio_func_rename (char *buf)
/* 1. Parameter: Ptr to oldpath / length incl. trailing zero */ /* 1. Parameter: Ptr to oldpath / length incl. trailing zero */
if (remote_fileio_extract_ptr_w_len (&buf, &old_ptr, &old_len)) if (remote_fileio_extract_ptr_w_len (&buf, &old_ptr, &old_len))
{ {
remote_fileio_ioerror (); remote_fileio_ioerror (remote);
return; return;
} }
/* 2. Parameter: Ptr to newpath / length incl. trailing zero */ /* 2. Parameter: Ptr to newpath / length incl. trailing zero */
if (remote_fileio_extract_ptr_w_len (&buf, &new_ptr, &new_len)) if (remote_fileio_extract_ptr_w_len (&buf, &new_ptr, &new_len))
{ {
remote_fileio_ioerror (); remote_fileio_ioerror (remote);
return; return;
} }
@ -740,7 +740,7 @@ remote_fileio_func_rename (char *buf)
oldpath = (char *) alloca (old_len); oldpath = (char *) alloca (old_len);
if (target_read_memory (old_ptr, (gdb_byte *) oldpath, old_len) != 0) if (target_read_memory (old_ptr, (gdb_byte *) oldpath, old_len) != 0)
{ {
remote_fileio_ioerror (); remote_fileio_ioerror (remote);
return; return;
} }
@ -748,7 +748,7 @@ remote_fileio_func_rename (char *buf)
newpath = (char *) alloca (new_len); newpath = (char *) alloca (new_len);
if (target_read_memory (new_ptr, (gdb_byte *) newpath, new_len) != 0) if (target_read_memory (new_ptr, (gdb_byte *) newpath, new_len) != 0)
{ {
remote_fileio_ioerror (); remote_fileio_ioerror (remote);
return; return;
} }
@ -758,7 +758,7 @@ remote_fileio_func_rename (char *buf)
if ((!of && !S_ISREG (ost.st_mode) && !S_ISDIR (ost.st_mode)) if ((!of && !S_ISREG (ost.st_mode) && !S_ISDIR (ost.st_mode))
|| (!nf && !S_ISREG (nst.st_mode) && !S_ISDIR (nst.st_mode))) || (!nf && !S_ISREG (nst.st_mode) && !S_ISDIR (nst.st_mode)))
{ {
remote_fileio_reply (-1, FILEIO_EACCES); remote_fileio_reply (remote, -1, FILEIO_EACCES);
return; return;
} }
@ -800,14 +800,14 @@ remote_fileio_func_rename (char *buf)
} }
#endif #endif
remote_fileio_return_errno (-1); remote_fileio_return_errno (remote, -1);
} }
else else
remote_fileio_return_success (ret); remote_fileio_return_success (remote, ret);
} }
static void static void
remote_fileio_func_unlink (char *buf) remote_fileio_func_unlink (remote_target *remote, char *buf)
{ {
CORE_ADDR ptrval; CORE_ADDR ptrval;
int length; int length;
@ -818,14 +818,14 @@ remote_fileio_func_unlink (char *buf)
/* Parameter: Ptr to pathname / length incl. trailing zero */ /* Parameter: Ptr to pathname / length incl. trailing zero */
if (remote_fileio_extract_ptr_w_len (&buf, &ptrval, &length)) if (remote_fileio_extract_ptr_w_len (&buf, &ptrval, &length))
{ {
remote_fileio_ioerror (); remote_fileio_ioerror (remote);
return; return;
} }
/* Request pathname using 'm' packet */ /* Request pathname using 'm' packet */
pathname = (char *) alloca (length); pathname = (char *) alloca (length);
if (target_read_memory (ptrval, (gdb_byte *) pathname, length) != 0) if (target_read_memory (ptrval, (gdb_byte *) pathname, length) != 0)
{ {
remote_fileio_ioerror (); remote_fileio_ioerror (remote);
return; return;
} }
@ -833,20 +833,20 @@ remote_fileio_func_unlink (char *buf)
the correct return code). */ the correct return code). */
if (!stat (pathname, &st) && !S_ISREG (st.st_mode) && !S_ISDIR (st.st_mode)) if (!stat (pathname, &st) && !S_ISREG (st.st_mode) && !S_ISDIR (st.st_mode))
{ {
remote_fileio_reply (-1, FILEIO_ENODEV); remote_fileio_reply (remote, -1, FILEIO_ENODEV);
return; return;
} }
ret = unlink (pathname); ret = unlink (pathname);
if (ret == -1) if (ret == -1)
remote_fileio_return_errno (-1); remote_fileio_return_errno (remote, -1);
else else
remote_fileio_return_success (ret); remote_fileio_return_success (remote, ret);
} }
static void static void
remote_fileio_func_stat (char *buf) remote_fileio_func_stat (remote_target *remote, char *buf)
{ {
CORE_ADDR statptr, nameptr; CORE_ADDR statptr, nameptr;
int ret, namelength; int ret, namelength;
@ -858,14 +858,14 @@ remote_fileio_func_stat (char *buf)
/* 1. Parameter: Ptr to pathname / length incl. trailing zero */ /* 1. Parameter: Ptr to pathname / length incl. trailing zero */
if (remote_fileio_extract_ptr_w_len (&buf, &nameptr, &namelength)) if (remote_fileio_extract_ptr_w_len (&buf, &nameptr, &namelength))
{ {
remote_fileio_ioerror (); remote_fileio_ioerror (remote);
return; return;
} }
/* 2. Parameter: Ptr to struct stat */ /* 2. Parameter: Ptr to struct stat */
if (remote_fileio_extract_long (&buf, &lnum)) if (remote_fileio_extract_long (&buf, &lnum))
{ {
remote_fileio_ioerror (); remote_fileio_ioerror (remote);
return; return;
} }
statptr = (CORE_ADDR) lnum; statptr = (CORE_ADDR) lnum;
@ -874,7 +874,7 @@ remote_fileio_func_stat (char *buf)
pathname = (char *) alloca (namelength); pathname = (char *) alloca (namelength);
if (target_read_memory (nameptr, (gdb_byte *) pathname, namelength) != 0) if (target_read_memory (nameptr, (gdb_byte *) pathname, namelength) != 0)
{ {
remote_fileio_ioerror (); remote_fileio_ioerror (remote);
return; return;
} }
@ -882,13 +882,13 @@ remote_fileio_func_stat (char *buf)
if (ret == -1) if (ret == -1)
{ {
remote_fileio_return_errno (-1); remote_fileio_return_errno (remote, -1);
return; return;
} }
/* Only operate on regular files and directories. */ /* Only operate on regular files and directories. */
if (!ret && !S_ISREG (st.st_mode) && !S_ISDIR (st.st_mode)) if (!ret && !S_ISREG (st.st_mode) && !S_ISDIR (st.st_mode))
{ {
remote_fileio_reply (-1, FILEIO_EACCES); remote_fileio_reply (remote, -1, FILEIO_EACCES);
return; return;
} }
if (statptr) if (statptr)
@ -899,15 +899,15 @@ remote_fileio_func_stat (char *buf)
errno = target_write_memory (statptr, (gdb_byte *) &fst, sizeof fst); errno = target_write_memory (statptr, (gdb_byte *) &fst, sizeof fst);
if (errno != 0) if (errno != 0)
{ {
remote_fileio_return_errno (-1); remote_fileio_return_errno (remote, -1);
return; return;
} }
} }
remote_fileio_return_success (ret); remote_fileio_return_success (remote, ret);
} }
static void static void
remote_fileio_func_fstat (char *buf) remote_fileio_func_fstat (remote_target *remote, char *buf)
{ {
CORE_ADDR ptrval; CORE_ADDR ptrval;
int fd, ret; int fd, ret;
@ -920,19 +920,19 @@ remote_fileio_func_fstat (char *buf)
/* 1. Parameter: file descriptor */ /* 1. Parameter: file descriptor */
if (remote_fileio_extract_int (&buf, &target_fd)) if (remote_fileio_extract_int (&buf, &target_fd))
{ {
remote_fileio_ioerror (); remote_fileio_ioerror (remote);
return; return;
} }
fd = remote_fileio_map_fd ((int) target_fd); fd = remote_fileio_map_fd ((int) target_fd);
if (fd == FIO_FD_INVALID) if (fd == FIO_FD_INVALID)
{ {
remote_fileio_badfd (); remote_fileio_badfd (remote);
return; return;
} }
/* 2. Parameter: Ptr to struct stat */ /* 2. Parameter: Ptr to struct stat */
if (remote_fileio_extract_long (&buf, &lnum)) if (remote_fileio_extract_long (&buf, &lnum))
{ {
remote_fileio_ioerror (); remote_fileio_ioerror (remote);
return; return;
} }
ptrval = (CORE_ADDR) lnum; ptrval = (CORE_ADDR) lnum;
@ -966,7 +966,7 @@ remote_fileio_func_fstat (char *buf)
if (ret == -1) if (ret == -1)
{ {
remote_fileio_return_errno (-1); remote_fileio_return_errno (remote, -1);
return; return;
} }
if (ptrval) if (ptrval)
@ -976,15 +976,15 @@ remote_fileio_func_fstat (char *buf)
errno = target_write_memory (ptrval, (gdb_byte *) &fst, sizeof fst); errno = target_write_memory (ptrval, (gdb_byte *) &fst, sizeof fst);
if (errno != 0) if (errno != 0)
{ {
remote_fileio_return_errno (-1); remote_fileio_return_errno (remote, -1);
return; return;
} }
} }
remote_fileio_return_success (ret); remote_fileio_return_success (remote, ret);
} }
static void static void
remote_fileio_func_gettimeofday (char *buf) remote_fileio_func_gettimeofday (remote_target *remote, char *buf)
{ {
LONGEST lnum; LONGEST lnum;
CORE_ADDR ptrval; CORE_ADDR ptrval;
@ -995,20 +995,20 @@ remote_fileio_func_gettimeofday (char *buf)
/* 1. Parameter: struct timeval pointer */ /* 1. Parameter: struct timeval pointer */
if (remote_fileio_extract_long (&buf, &lnum)) if (remote_fileio_extract_long (&buf, &lnum))
{ {
remote_fileio_ioerror (); remote_fileio_ioerror (remote);
return; return;
} }
ptrval = (CORE_ADDR) lnum; ptrval = (CORE_ADDR) lnum;
/* 2. Parameter: some pointer value... */ /* 2. Parameter: some pointer value... */
if (remote_fileio_extract_long (&buf, &lnum)) if (remote_fileio_extract_long (&buf, &lnum))
{ {
remote_fileio_ioerror (); remote_fileio_ioerror (remote);
return; return;
} }
/* ...which has to be NULL. */ /* ...which has to be NULL. */
if (lnum) if (lnum)
{ {
remote_fileio_reply (-1, FILEIO_EINVAL); remote_fileio_reply (remote, -1, FILEIO_EINVAL);
return; return;
} }
@ -1016,7 +1016,7 @@ remote_fileio_func_gettimeofday (char *buf)
if (ret == -1) if (ret == -1)
{ {
remote_fileio_return_errno (-1); remote_fileio_return_errno (remote, -1);
return; return;
} }
@ -1027,15 +1027,15 @@ remote_fileio_func_gettimeofday (char *buf)
errno = target_write_memory (ptrval, (gdb_byte *) &ftv, sizeof ftv); errno = target_write_memory (ptrval, (gdb_byte *) &ftv, sizeof ftv);
if (errno != 0) if (errno != 0)
{ {
remote_fileio_return_errno (-1); remote_fileio_return_errno (remote, -1);
return; return;
} }
} }
remote_fileio_return_success (ret); remote_fileio_return_success (remote, ret);
} }
static void static void
remote_fileio_func_isatty (char *buf) remote_fileio_func_isatty (remote_target *remote, char *buf)
{ {
long target_fd; long target_fd;
int fd; int fd;
@ -1043,16 +1043,16 @@ remote_fileio_func_isatty (char *buf)
/* Parameter: file descriptor */ /* Parameter: file descriptor */
if (remote_fileio_extract_int (&buf, &target_fd)) if (remote_fileio_extract_int (&buf, &target_fd))
{ {
remote_fileio_ioerror (); remote_fileio_ioerror (remote);
return; return;
} }
fd = remote_fileio_map_fd ((int) target_fd); fd = remote_fileio_map_fd ((int) target_fd);
remote_fileio_return_success (fd == FIO_FD_CONSOLE_IN || int ret = fd == FIO_FD_CONSOLE_IN || fd == FIO_FD_CONSOLE_OUT ? 1 : 0;
fd == FIO_FD_CONSOLE_OUT ? 1 : 0); remote_fileio_return_success (remote, ret);
} }
static void static void
remote_fileio_func_system (char *buf) remote_fileio_func_system (remote_target *remote, char *buf)
{ {
CORE_ADDR ptrval; CORE_ADDR ptrval;
int ret, length; int ret, length;
@ -1061,7 +1061,7 @@ remote_fileio_func_system (char *buf)
/* Parameter: Ptr to commandline / length incl. trailing zero */ /* Parameter: Ptr to commandline / length incl. trailing zero */
if (remote_fileio_extract_ptr_w_len (&buf, &ptrval, &length)) if (remote_fileio_extract_ptr_w_len (&buf, &ptrval, &length))
{ {
remote_fileio_ioerror (); remote_fileio_ioerror (remote);
return; return;
} }
@ -1071,7 +1071,7 @@ remote_fileio_func_system (char *buf)
cmdline = (char *) alloca (length); cmdline = (char *) alloca (length);
if (target_read_memory (ptrval, (gdb_byte *) cmdline, length) != 0) if (target_read_memory (ptrval, (gdb_byte *) cmdline, length) != 0)
{ {
remote_fileio_ioerror (); remote_fileio_ioerror (remote);
return; return;
} }
} }
@ -1083,25 +1083,25 @@ remote_fileio_func_system (char *buf)
if (!remote_fio_system_call_allowed) if (!remote_fio_system_call_allowed)
{ {
if (!length) if (!length)
remote_fileio_return_success (0); remote_fileio_return_success (remote, 0);
else else
remote_fileio_reply (-1, FILEIO_EPERM); remote_fileio_reply (remote, -1, FILEIO_EPERM);
return; return;
} }
ret = system (cmdline); ret = system (cmdline);
if (!length) if (!length)
remote_fileio_return_success (ret); remote_fileio_return_success (remote, ret);
else if (ret == -1) else if (ret == -1)
remote_fileio_return_errno (-1); remote_fileio_return_errno (remote, -1);
else else
remote_fileio_return_success (WEXITSTATUS (ret)); remote_fileio_return_success (remote, WEXITSTATUS (ret));
} }
static struct { static struct {
const char *name; const char *name;
void (*func)(char *); void (*func)(remote_target *remote, char *);
} remote_fio_func_map[] = { } remote_fio_func_map[] = {
{ "open", remote_fileio_func_open }, { "open", remote_fileio_func_open },
{ "close", remote_fileio_func_close }, { "close", remote_fileio_func_close },
@ -1119,7 +1119,7 @@ static struct {
}; };
static void static void
do_remote_fileio_request (char *buf) do_remote_fileio_request (remote_target *remote, char *buf)
{ {
char *c; char *c;
int idx; int idx;
@ -1135,9 +1135,9 @@ do_remote_fileio_request (char *buf)
if (!strcmp (remote_fio_func_map[idx].name, buf)) if (!strcmp (remote_fio_func_map[idx].name, buf))
break; break;
if (!remote_fio_func_map[idx].name) if (!remote_fio_func_map[idx].name)
remote_fileio_reply (-1, FILEIO_ENOSYS); remote_fileio_reply (remote, -1, FILEIO_ENOSYS);
else else
remote_fio_func_map[idx].func (c); remote_fio_func_map[idx].func (remote, c);
} }
/* Close any open descriptors, and reinitialize the file mapping. */ /* Close any open descriptors, and reinitialize the file mapping. */
@ -1167,7 +1167,7 @@ remote_fileio_reset (void)
acknowledged the Ctrl-C sent asynchronously earlier. */ acknowledged the Ctrl-C sent asynchronously earlier. */
void void
remote_fileio_request (char *buf, int ctrlc_pending_p) remote_fileio_request (remote_target *remote, char *buf, int ctrlc_pending_p)
{ {
/* Save the previous quit handler, so we can restore it. No need /* Save the previous quit handler, so we can restore it. No need
for a cleanup since we catch all exceptions below. Note that the for a cleanup since we catch all exceptions below. Note that the
@ -1181,20 +1181,20 @@ remote_fileio_request (char *buf, int ctrlc_pending_p)
asynchronously earlier, take this opportunity to send the asynchronously earlier, take this opportunity to send the
Ctrl-C synchronously. */ Ctrl-C synchronously. */
set_quit_flag (); set_quit_flag ();
remote_fileio_reply (-1, FILEIO_EINTR); remote_fileio_reply (remote, -1, FILEIO_EINTR);
} }
else else
{ {
TRY TRY
{ {
do_remote_fileio_request (buf); do_remote_fileio_request (remote, buf);
} }
CATCH (ex, RETURN_MASK_ALL) CATCH (ex, RETURN_MASK_ALL)
{ {
if (ex.reason == RETURN_QUIT) if (ex.reason == RETURN_QUIT)
remote_fileio_reply (-1, FILEIO_EINTR); remote_fileio_reply (remote, -1, FILEIO_EINTR);
else else
remote_fileio_reply (-1, FILEIO_EIO); remote_fileio_reply (remote, -1, FILEIO_EIO);
} }
END_CATCH END_CATCH
} }

View file

@ -28,7 +28,8 @@ 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, int ctrlc_pending_p); extern void remote_fileio_request (remote_target *remote,
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

@ -58,7 +58,8 @@ static void do_notif_event_xfree (void *arg);
acknowledge. */ acknowledge. */
void void
remote_notif_ack (struct notif_client *nc, char *buf) remote_notif_ack (remote_target *remote,
struct notif_client *nc, char *buf)
{ {
struct notif_event *event = nc->alloc_event (); struct notif_event *event = nc->alloc_event ();
struct cleanup *old_chain struct cleanup *old_chain
@ -68,8 +69,8 @@ remote_notif_ack (struct notif_client *nc, char *buf)
fprintf_unfiltered (gdb_stdlog, "notif: ack '%s'\n", fprintf_unfiltered (gdb_stdlog, "notif: ack '%s'\n",
nc->ack_command); nc->ack_command);
nc->parse (nc, buf, event); nc->parse (remote, nc, buf, event);
nc->ack (nc, buf, event); nc->ack (remote, nc, buf, event);
discard_cleanups (old_chain); discard_cleanups (old_chain);
} }
@ -77,7 +78,8 @@ remote_notif_ack (struct notif_client *nc, char *buf)
/* Parse the BUF for the expected notification NC. */ /* Parse the BUF for the expected notification NC. */
struct notif_event * struct notif_event *
remote_notif_parse (struct notif_client *nc, char *buf) remote_notif_parse (remote_target *remote,
struct notif_client *nc, char *buf)
{ {
struct notif_event *event = nc->alloc_event (); struct notif_event *event = nc->alloc_event ();
struct cleanup *old_chain struct cleanup *old_chain
@ -86,7 +88,7 @@ remote_notif_parse (struct notif_client *nc, char *buf)
if (notif_debug) if (notif_debug)
fprintf_unfiltered (gdb_stdlog, "notif: parse '%s'\n", nc->name); fprintf_unfiltered (gdb_stdlog, "notif: parse '%s'\n", nc->name);
nc->parse (nc, buf, event); nc->parse (remote, nc, buf, event);
discard_cleanups (old_chain); discard_cleanups (old_chain);
return event; return event;
@ -108,8 +110,8 @@ remote_notif_process (struct remote_notif_state *state,
gdb_assert (nc != except); gdb_assert (nc != except);
if (nc->can_get_pending_events (nc)) if (nc->can_get_pending_events (state->remote, nc))
remote_notif_get_pending_events (nc); remote_notif_get_pending_events (state->remote, nc);
} }
} }
@ -157,7 +159,7 @@ handle_notification (struct remote_notif_state *state, char *buf)
else else
{ {
struct notif_event *event struct notif_event *event
= remote_notif_parse (nc, buf + strlen (nc->name) + 1); = remote_notif_parse (state->remote, nc, buf + strlen (nc->name) + 1);
/* Be careful to only set it after parsing, since an error /* Be careful to only set it after parsing, since an error
may be thrown then. */ may be thrown then. */
@ -236,10 +238,12 @@ do_notif_event_xfree (void *arg)
/* Return an allocated remote_notif_state. */ /* Return an allocated remote_notif_state. */
struct remote_notif_state * struct remote_notif_state *
remote_notif_state_allocate (void) remote_notif_state_allocate (remote_target *remote)
{ {
struct remote_notif_state *notif_state = XCNEW (struct remote_notif_state); struct remote_notif_state *notif_state = XCNEW (struct remote_notif_state);
notif_state->remote = remote;
notif_state->notif_queue = QUEUE_alloc (notif_client_p, NULL); notif_state->notif_queue = QUEUE_alloc (notif_client_p, NULL);
/* Register async_event_handler for notification. */ /* Register async_event_handler for notification. */

View file

@ -39,6 +39,8 @@ enum REMOTE_NOTIF_ID
REMOTE_NOTIF_LAST, REMOTE_NOTIF_LAST,
}; };
struct remote_target;
/* A client to a sort of async remote notification. */ /* A client to a sort of async remote notification. */
typedef struct notif_client typedef struct notif_client
@ -52,17 +54,20 @@ typedef struct notif_client
/* Parse BUF to get the expected event and update EVENT. This /* Parse BUF to get the expected event and update EVENT. This
function may throw exception if contents in BUF is not the function may throw exception if contents in BUF is not the
expected event. */ expected event. */
void (*parse) (struct notif_client *self, char *buf, void (*parse) (remote_target *remote,
struct notif_client *self, char *buf,
struct notif_event *event); struct notif_event *event);
/* Send field <ack_command> to remote, and do some checking. If /* Send field <ack_command> to remote, and do some checking. If
something wrong, throw an exception. */ something wrong, throw an exception. */
void (*ack) (struct notif_client *self, char *buf, void (*ack) (remote_target *remote,
struct notif_client *self, char *buf,
struct notif_event *event); struct notif_event *event);
/* Check this notification client can get pending events in /* Check this notification client can get pending events in
'remote_notif_process'. */ 'remote_notif_process'. */
int (*can_get_pending_events) (struct notif_client *self); int (*can_get_pending_events) (remote_target *remote,
struct notif_client *self);
/* Allocate an event. */ /* Allocate an event. */
struct notif_event *(*alloc_event) (void); struct notif_event *(*alloc_event) (void);
@ -77,6 +82,9 @@ DECLARE_QUEUE_P (notif_client_p);
struct remote_notif_state struct remote_notif_state
{ {
/* The remote target. */
remote_target *remote;
/* Notification queue. */ /* Notification queue. */
QUEUE(notif_client_p) *notif_queue; QUEUE(notif_client_p) *notif_queue;
@ -98,8 +106,9 @@ struct remote_notif_state
struct notif_event *pending_event[REMOTE_NOTIF_LAST]; struct notif_event *pending_event[REMOTE_NOTIF_LAST];
}; };
void remote_notif_ack (struct notif_client *nc, char *buf); void remote_notif_ack (remote_target *remote, notif_client *nc, char *buf);
struct notif_event *remote_notif_parse (struct notif_client *nc, struct notif_event *remote_notif_parse (remote_target *remote,
notif_client *nc,
char *buf); char *buf);
void notif_event_xfree (struct notif_event *event); void notif_event_xfree (struct notif_event *event);
@ -109,7 +118,7 @@ void handle_notification (struct remote_notif_state *notif_state,
void remote_notif_process (struct remote_notif_state *state, void remote_notif_process (struct remote_notif_state *state,
struct notif_client *except); struct notif_client *except);
struct remote_notif_state *remote_notif_state_allocate (void); remote_notif_state *remote_notif_state_allocate (remote_target *remote);
void remote_notif_state_xfree (struct remote_notif_state *state); void remote_notif_state_xfree (struct remote_notif_state *state);
extern struct notif_client notif_client_stop; extern struct notif_client notif_client_stop;

File diff suppressed because it is too large Load diff

View file

@ -22,6 +22,7 @@
#include "remote-notif.h" #include "remote-notif.h"
struct target_desc; struct target_desc;
struct remote_target;
/* Read a packet from the remote machine, with error checking, and /* Read a packet from the remote machine, with error checking, and
store it in *BUF. Resize *BUF using xrealloc if necessary to hold store it in *BUF. Resize *BUF using xrealloc if necessary to hold
@ -29,7 +30,8 @@ struct target_desc;
rather than timing out; this is used (in synchronous mode) to wait rather than timing out; this is used (in synchronous mode) to wait
for a target that is is executing user code to stop. */ for a target that is is executing user code to stop. */
extern void getpkt (char **buf, long *sizeof_buf, int forever); extern void getpkt (remote_target *remote,
char **buf, long *sizeof_buf, int forever);
/* Send a packet to the remote machine, with error checking. The data /* Send a packet to the remote machine, with error checking. The data
of the packet is in BUF. The string in BUF can be at most PBUFSIZ of the packet is in BUF. The string in BUF can be at most PBUFSIZ
@ -37,7 +39,7 @@ extern void getpkt (char **buf, long *sizeof_buf, int forever);
we are debugging (remote_debug) and want to print the sent packet we are debugging (remote_debug) and want to print the sent packet
as a string. */ as a string. */
extern int putpkt (const char *buf); extern int putpkt (remote_target *remote, const char *buf);
void register_remote_g_packet_guess (struct gdbarch *gdbarch, int bytes, void register_remote_g_packet_guess (struct gdbarch *gdbarch, int bytes,
const struct target_desc *tdesc); const struct target_desc *tdesc);
@ -53,5 +55,6 @@ extern int remote_register_number_and_offset (struct gdbarch *gdbarch,
int regnum, int *pnum, int regnum, int *pnum,
int *poffset); int *poffset);
extern void remote_notif_get_pending_events (struct notif_client *np); extern void remote_notif_get_pending_events (remote_target *remote,
struct notif_client *np);
#endif #endif