public inbox for archer-commits@sourceware.org
help / color / mirror / Atom feed
* [SCM] scox/globalstate: Differentiate client_state members by "_" suffix
@ 2015-11-04 19:36 scox
0 siblings, 0 replies; only message in thread
From: scox @ 2015-11-04 19:36 UTC (permalink / raw)
To: archer-commits
The branch, scox/globalstate has been updated
via 0bee029c99922ca26020016079c299fe2b01df59 (commit)
from f5936a9aa6a56493123550de032fcd93f26e57c2 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email.
- Log -----------------------------------------------------------------
commit 0bee029c99922ca26020016079c299fe2b01df59
Author: Stan Cox <scox@redhat.com>
Date: Wed Nov 4 14:34:56 2015 -0500
Differentiate client_state members by "_" suffix
gdb/gdbserver/Changelog
* server.h (client_state): Remove executable and all its references.
Remove all extern dcls for items now in client_state. Add _
suffix for those items.
* server.c (add_client_by_pid): Use general_thread not last_ptid.
(add_client_by_exe): Remove.
(have_multiple_clients): Use attach_count.
(handle_qxfer_threads_worker): Attached client is multiple inferior agnostic.
(handle_v_attach): Attach of non-stop multiple client should only ok.
-----------------------------------------------------------------------
Summary of changes:
gdb/gdbserver/ChangeLog | 13 ++
gdb/gdbserver/event-loop.c | 2 +-
gdb/gdbserver/server.c | 160 ++++++++++--------------
gdb/gdbserver/server.h | 192 ++++++++++++-----------------
gdb/testsuite/ChangeLog | 4 +
gdb/testsuite/gdb.server/multi-client.exp | 98 +++++++++++++--
6 files changed, 247 insertions(+), 222 deletions(-)
First 500 lines of diff:
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog
index c8e33f7..3ac724f 100644
--- a/gdb/gdbserver/ChangeLog
+++ b/gdb/gdbserver/ChangeLog
@@ -1,3 +1,16 @@
+2015-11-04 Stan Cox <scox@redhat.com>
+
+ * server.h (client_state): Remove executable and all its references.
+ Remove all extern dcls for items now in client_state. Add _
+ suffix for those members.
+
+ * server.c (add_client_by_pid): Use general_thread not last_ptid.
+ (add_client_by_exe): Remove.
+ (have_multiple_clients): Use attach_count.
+ (handle_qxfer_threads_worker): Attached client is multiple
+ inferior agnostic.
+ (handle_v_attach): Attach of non-stop multiple client should only ok.
+
2015-10-06 Stan Cox <scox@redhat.com>
* server.c (setup_multiplexing): Insure we always have a waitee.
diff --git a/gdb/gdbserver/event-loop.c b/gdb/gdbserver/event-loop.c
index 92287c2..1679464 100644
--- a/gdb/gdbserver/event-loop.c
+++ b/gdb/gdbserver/event-loop.c
@@ -428,7 +428,7 @@ handle_file_event (gdb_fildes_t event_file_desc)
if (mask != 0)
{
/* Don't change client states if we have multiple clients */
- if (have_multiple_clients () || get_client_state()->executable == 0)
+ if (have_multiple_clients (file_ptr->fd) || ptid_equal (general_thread, null_ptid))
set_client_state (file_ptr->fd);
if ((*file_ptr->proc) (file_ptr->error,
file_ptr->client_data) < 0)
diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c
index 5e04a1e..cb552ec 100644
--- a/gdb/gdbserver/server.c
+++ b/gdb/gdbserver/server.c
@@ -109,7 +109,7 @@ set_client_state (gdb_fildes_t fd)
* fd = F add client state for fd F
*/
- client_state *csidx;
+ client_state *csidx, *cs;
/* add/return initial client state */
if (fd == -1)
@@ -142,36 +142,26 @@ set_client_state (gdb_fildes_t fd)
}
/* add client state S for fd F */
- if (client_states.current_fd == -1 && client_states.current_cs->executable != NULL)
- {
- client_states.current_cs = XCNEW (client_state);
- *client_states.current_cs = *client_states.first;
- }
- else
- {
- client_state *cs;
- client_states.current_cs = XCNEW (client_state);
- *client_states.current_cs = *csidx;
- client_states.current_cs->ss = XCNEW (server_state);
- *client_states.current_cs->ss = *csidx->ss;
- cs = client_states.current_cs;
- cs->packet_type = other_packet;
- cs->executable = NULL;
- cs->client_breakpoints = NULL;
- in_buffer = NULL;
- wrapper_argv = NULL;
- get_client_state()->ss->attach_count = 0;
- cont_thread = null_ptid;
- general_thread = null_ptid;
- signal_pid = 0;
- last_ptid = null_ptid;
- last_status.kind = TARGET_WAITKIND_IGNORE;
- current_thread = NULL;
- all_processes.head = NULL;
- all_processes.tail = NULL;
- all_threads.head = NULL;
- all_threads.tail = NULL;
- }
+ client_states.current_cs = XCNEW (client_state);
+ *client_states.current_cs = *csidx;
+ client_states.current_cs->ss = XCNEW (server_state);
+ *client_states.current_cs->ss = *csidx->ss;
+ cs = client_states.current_cs;
+ cs->packet_type = other_packet;
+ cs->client_breakpoints = NULL;
+ in_buffer = NULL;
+ wrapper_argv = NULL;
+ get_client_state()->ss->attach_count_ = 0;
+ cont_thread = null_ptid;
+ general_thread = null_ptid;
+ signal_pid = 0;
+ last_ptid = null_ptid;
+ last_status.kind = TARGET_WAITKIND_IGNORE;
+ current_thread = NULL;
+ all_processes.head = NULL;
+ all_processes.tail = NULL;
+ all_threads.head = NULL;
+ all_threads.tail = NULL;
client_states.current_cs->file_desc = fd;
own_buffer = xmalloc (PBUFSIZ + 1);
client_states.current_fd = fd;
@@ -252,16 +242,13 @@ static void free_client_state (client_state *cs)
client_state *csi;
for (csi = client_states.first; csi != NULL; csi = csi->next)
{
- if (csi->executable && csi != cs && csi->ss == cs->ss)
+ if (ptid_equal (csi->ss->general_thread_, null_ptid) && csi != cs && csi->ss == cs->ss)
break;
}
delete_client_breakpoint (0);
if (csi == NULL)
- {
- XDELETE (cs->ss);
- if (get_client_state()->executable)
- xfree (get_client_state()->executable);
- }
+ XDELETE (cs->ss);
+
if (in_buffer)
xfree (in_buffer);
xfree (own_buffer);
@@ -280,19 +267,22 @@ dump_client_state (const char *comment)
if (! debug_threads)
return;
- debug_printf ("Dumping client state from %s\n", comment);
-
+ debug_printf ("***Begin Dumping client state from %s\n", comment);
for (cs = client_states.first; cs != NULL; cs = cs->next)
{
client_states.current_cs = cs;
- debug_printf ("%s %d cont_thr %#lx gen thr %#lx attached? %d\n",
- cs->executable, cs->file_desc, (long unsigned)cont_thread.pid,
- (long unsigned)general_thread.pid, cs->ss->attach_count);
- debug_printf ("%d all procs %#lx all thrs %#lx curr thr %#lx %s/%s/%s\n",
- (int)last_ptid.pid, (unsigned long)all_processes.head,
- (unsigned long)all_threads.head, (unsigned long)current_thread,
- packet_types_str[cs->packet_type], packet_types_str[cs->last_packet_type], pending_types_str[cs->pending]);
- }
+ debug_printf ("%d %#lx(%d)/%#lx/%#lx #=%d %s %s %s\n",
+ cs->file_desc,
+ (long unsigned)general_thread.pid,
+ (int)general_thread.pid,
+ (long unsigned)cont_thread.pid,
+ (long unsigned)last_ptid.pid,
+ cs->ss->attach_count_,
+ packet_types_str[cs->packet_type],
+ packet_types_str[cs->last_packet_type],
+ pending_types_str[cs->pending]);
+ }
+ debug_printf ("***End Dumping client state from %s\n", comment);
client_states.current_cs = save_cs;
}
@@ -307,15 +297,12 @@ add_client_by_pid (int pid)
for (matched_cs = client_states.first; matched_cs != NULL; matched_cs = matched_cs->next)
{
- if (cs != matched_cs && matched_cs->ss->last_ptid_.pid == pid)
+ if (cs != matched_cs && matched_cs->ss->general_thread_.pid == pid)
{
- matched_cs->ss->attach_count += 1;
- xfree (cs->executable);
- cs->executable = matched_cs->executable;
XDELETE (cs->ss);
/* reuse the matched server state */
cs->ss = matched_cs->ss;
- cs->ss->attach_count += 1;
+ cs->ss->attach_count_ += 1;
return cs;
}
}
@@ -323,30 +310,6 @@ add_client_by_pid (int pid)
}
-/* Add another client for EXECUTABLE to the 1 server -> N client list. */
-
-client_state *
-add_client_by_exe (char *executable)
-{
- client_state *csi;
- char *new_executable;
- client_state *cs = get_client_state ();
-
- dump_client_state(__FUNCTION__);
-
- for (csi = client_states.first; csi != NULL; csi = csi->next)
- {
- if (csi->executable && strcmp (csi->executable, executable) == 0 && csi != cs)
- break;
- }
-
- new_executable = xmalloc (strlen (executable) + 1);
- strcpy (new_executable, executable);
- cs->executable = new_executable;
- return NULL;
-}
-
-
/* Return the first active client state */
gdb_fildes_t
@@ -355,10 +318,8 @@ get_first_client_fd ()
client_state *cs;
for (cs = client_states.first; cs != NULL; cs = cs->next)
{
- if (cs->file_desc > 0 && cs->executable != NULL)
- {
- return cs->file_desc;
- }
+ if (cs->file_desc > 0 && cs->attached_to_client == 1)
+ return cs->file_desc;
}
return -1;
}
@@ -367,16 +328,15 @@ get_first_client_fd ()
/* Is there more than one active client? */
int
-have_multiple_clients ()
+have_multiple_clients (gdb_fildes_t fd)
{
client_state *cs;
- int n_client_states= 0;
+ dump_client_state(__FUNCTION__);
+
for (cs = client_states.first; cs != NULL; cs = cs->next)
- {
- if (cs->file_desc > 0 && cs->executable != NULL)
- n_client_states += 1;
- }
- return n_client_states > 1;
+ if (cs->file_desc == fd)
+ return (cs->ss->attach_count_ > 0);
+ return 0;
}
@@ -408,7 +368,7 @@ delete_client_state (gdb_fildes_t fd)
{
if (cs->ss == ss)
{
- cs->ss->attach_count -= 1;
+ cs->ss->attach_count_ -= 1;
set_client_state (cs->file_desc);
}
}
@@ -500,6 +460,8 @@ setup_multiplexing (client_state *cs, char *ch)
dump_client_state (__FUNCTION__);
+ cs->attached_to_client = 1;
+
for (csidx = client_states.first; csidx != NULL; csidx = csidx->next)
{
/* another client is attached to the cs process */
@@ -777,8 +739,6 @@ start_inferior (char **argv)
debug_flush ();
}
- add_client_by_exe (new_argv[0]);
-
#ifdef SIGTTOU
signal (SIGTTOU, SIG_DFL);
signal (SIGTTIN, SIG_DFL);
@@ -2034,6 +1994,11 @@ handle_qxfer_threads_worker (struct inferior_list_entry *inf, void *arg)
int core = target_core_of_thread (ptid);
char core_s[21];
+ // TODO an attached client does not know about multiple inferiors
+ if (ptid_get_pid (inf->id) != ptid_get_pid (general_thread)
+ && attach_count > 0)
+ return;
+
write_ptid (ptid_s, ptid);
if (core != -1)
@@ -2952,7 +2917,7 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p)
return;
}
- strcpy (own_buf, process->attached || get_client_state()->ss->attach_count ? "1" : "0");
+ strcpy (own_buf, process->attached || get_client_state()->ss->attach_count_ ? "1" : "0");
return;
}
@@ -3238,8 +3203,13 @@ handle_v_attach (char *own_buf)
pid = strtol (own_buf + 8, NULL, 16);
if (add_client_by_pid (pid))
{
- strcpy (own_buf, "?");
- handle_status (own_buf);
+ if (! non_stop)
+ {
+ strcpy (own_buf, "?");
+ handle_status (own_buf);
+ }
+ else
+ write_ok (own_buf);
return 1;
}
else if (pid != 0 && attach_inferior (pid) == 0)
@@ -4441,7 +4411,7 @@ process_serial_event (void)
fprintf (stderr, "Detaching from process %d\n", pid);
stop_tracing ();
- if (cs->ss->attach_count > 0)
+ if (cs->ss->attach_count_ > 0)
write_ok (own_buffer);
else if (detach_inferior (pid) != 0)
write_enn (own_buffer);
@@ -4452,7 +4422,7 @@ process_serial_event (void)
if (extended_protocol)
{
- if (cs->ss->attach_count == 0)
+ if (cs->ss->attach_count_ == 0)
{
/* Treat this like a normal program exit. */
last_status.kind = TARGET_WAITKIND_EXITED;
diff --git a/gdb/gdbserver/server.h b/gdb/gdbserver/server.h
index 48b18ab..a17ecc5 100644
--- a/gdb/gdbserver/server.h
+++ b/gdb/gdbserver/server.h
@@ -67,41 +67,11 @@ int vsnprintf(char *str, size_t size, const char *format, va_list ap);
void initialize_low ();
-/* Public variables in server.c */
-
-extern ptid_t cont_thread;
-extern ptid_t general_thread;
-
-extern int server_waiting;
-extern int pass_signals[];
-extern int program_signals[];
-extern int program_signals_p;
-
extern int disable_packet_vCont;
extern int disable_packet_Tthread;
extern int disable_packet_qC;
extern int disable_packet_qfThreadInfo;
-extern int run_once;
-extern int multi_process;
-extern int report_fork_events;
-extern int report_vfork_events;
-extern int non_stop;
-extern int extended_protocol;
-
-/* True if the "swbreak+" feature is active. In that case, GDB wants
- us to report whether a trap is explained by a software breakpoint
- and for the server to handle PC adjustment if necessary on this
- target. Only enabled if the target supports it. */
-extern int swbreak_feature;
-
-/* True if the "hwbreak+" feature is active. In that case, GDB wants
- us to report whether a trap is explained by a hardware breakpoint.
- Only enabled if the target supports it. */
-extern int hwbreak_feature;
-
-extern int disable_randomization;
-
#if USE_WIN32API
#include <winsock2.h>
typedef SOCKET gdb_fildes_t;
@@ -136,11 +106,11 @@ extern void discard_queued_stop_replies (ptid_t ptid);
/* Description of the remote protocol state for the currently
connected target. This is per-target state, and independent of the
- selected architecture. The unions allow bypassing the access macros.\ */
+ selected architecture. */
struct server_state
{
- int attach_count;
+ int attach_count_;
/* From server.c */
/* The thread set with an `Hc' packet. `Hc' is deprecated in favor of
`vCont'. Note the multi-process extensions made `vCont' a
@@ -148,40 +118,31 @@ struct server_state
CONT_THREAD can be null_ptid for no `Hc' thread, minus_one_ptid for
resuming all threads of the process (again, `Hc' isn't used for
multi-process), or a specific thread ptid_t. */
- ptid_t cont_thread;
+ ptid_t cont_thread_;
/* The thread set with an `Hg' packet. */
- ptid_t general_thread;
+ ptid_t general_thread_;
/* The PID of the originally created or attached inferior. Used to
send signals to the process when GDB sends us an asynchronous interrupt
(user hitting Control-C in the client), and to wait for the child to exit
when no longer debugging it. */
- unsigned long signal_pid;
+ unsigned long signal_pid_;
/* Last status reported to GDB. */
- union {
- struct target_waitstatus last_status;
- struct target_waitstatus last_status_;
- };
- union {
- ptid_t last_ptid;
- ptid_t last_ptid_;
- };
- unsigned char *mem_buf;
+ struct target_waitstatus last_status_;
+ ptid_t last_ptid_;
+ unsigned char *mem_buf_;
/* from remote-utils.c */
/* Internal buffer used by readchar.
These are global to readchar because reschedule_remote needs to be
able to tell whether the buffer is empty. */
- unsigned char readchar_buf[BUFSIZ];
- int readchar_bufcnt;
- unsigned char *readchar_bufp;
+ unsigned char readchar_buf_[BUFSIZ];
+ int readchar_bufcnt_;
+ unsigned char *readchar_bufp_;
/* from inferiors.c */
- struct inferior_list all_processes;
- struct inferior_list all_threads;
- union {
- struct thread_info *current_thread;
- struct thread_info *current_thread_;
- };
+ struct inferior_list all_processes_;
+ struct inferior_list all_threads_;
+ struct thread_info *current_thread_;
};
typedef struct server_state server_state;
@@ -198,46 +159,48 @@ typedef enum packet_types packet_types;
struct client_state
{
gdb_fildes_t file_desc;
- char *executable;
+ int attached_to_client;
int packet_type;
int last_packet_type;
int pending;
/* From server.c */
- int server_waiting;
+ int server_waiting_;
- int extended_protocol;
- int response_needed;
- union {
- int exit_requested;
- int exit_requested_;
- };
+ int extended_protocol_;
+ int response_needed_;
+ int exit_requested_;
/* --once: Exit after the first connection has closed. */
- int run_once;
-
- int multi_process;
- int report_fork_events;
- int report_vfork_events;
- int non_stop;
- int swbreak_feature;
- int hwbreak_feature;
+ int run_once_;
+
+ int multi_process_;
+ int report_fork_events_;
+ int report_vfork_events_;
+ int non_stop_;
+ /* True if the "swbreak+" feature is active. In that case, GDB wants
+ us to report whether a trap is explained by a software breakpoint
+ and for the server to handle PC adjustment if necessary on this
+ target. Only enabled if the target supports it. */
+ int swbreak_feature_;
+ /* True if the "hwbreak+" feature is active. In that case, GDB wants
+ us to report whether a trap is explained by a hardware breakpoint.
+ Only enabled if the target supports it. */
+ int hwbreak_feature_;
/* Whether we should attempt to disable the operating system's address
space randomization feature before starting an inferior. */
- int disable_randomization;
-
- char **program_argv, **wrapper_argv;
- int packet_length;
-
- int pass_signals[GDB_SIGNAL_LAST];
- int program_signals[GDB_SIGNAL_LAST];
- int program_signals_p;
- char *in_buffer;
- union {
- char *own_buffer;
- char *own_buffer_;
hooks/post-receive
--
Repository for Project Archer.
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2015-11-04 19:36 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-11-04 19:36 [SCM] scox/globalstate: Differentiate client_state members by "_" suffix scox
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).