From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 23125 invoked by alias); 3 Feb 2015 17:28:21 -0000 Mailing-List: contact archer-commits-help@sourceware.org; run by ezmlm Sender: Precedence: bulk List-Post: List-Help: List-Subscribe: Received: (qmail 23090 invoked by uid 440); 3 Feb 2015 17:28:21 -0000 Date: Tue, 03 Feb 2015 17:28:00 -0000 Message-ID: <20150203172821.23059.qmail@sourceware.org> From: scox@sourceware.org To: archer-commits@sourceware.org Subject: [SCM] scox/dyninst: Move global state to client_state and change callers X-Git-Refname: refs/heads/scox/dyninst X-Git-Reftype: branch X-Git-Oldrev: aa94c518bc927f2214532a512d9c7399f9ec32d2 X-Git-Newrev: 9bd9119042646a9f974898ae4ef7a92b074268fd X-SW-Source: 2015-q1/txt/msg00001.txt.bz2 List-Id: The branch, scox/dyninst has been updated via 9bd9119042646a9f974898ae4ef7a92b074268fd (commit) from aa94c518bc927f2214532a512d9c7399f9ec32d2 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit 9bd9119042646a9f974898ae4ef7a92b074268fd Author: Stan Cox Date: Tue Feb 3 12:25:09 2015 -0500 Move global state to client_state and change callers * server.h ** Add struct client_state. All global variables are moved here. ** Change 'global_var' to 'cs = ...; cs->global_var...;' * server.c ** new_client_state creates a client_state for a new connection. ** set_client_state contains a static first_client_state which links to sibling client_state *** if there is no client_state for this fd create it, otherwise return it *** save the fd, if we are called with an fd of 0, return the client_state for the saved fd ** get_remote_desc is called wherever a global variable is accessed ** handle_query adds a parameter for the client_state pointer ** handle_v_requests adds a parameter for the client_state pointer ** captured_main sets up first_client_state ** process_serial_event adds a parameter for the client_state pointer * event-loop.c ** wait_for_event now adds a select in case another client tries to connect *** add a new client if so * remote-utils.c ** get_remote_desc and get_listen_desc are added so these fds can be accessed outside remote-utils.c ** handle_accept_event turns noack mode off as a subsequent connection seems to assume that *** set the default client_state to the new fd and don't close the listen_desc ** remote_open adds a parameter for client_state ** write_prim, read_prim, readchar, and getpkt add a parameter for fd ----------------------------------------------------------------------- Summary of changes: gdb/gdbserver/dyninst-low.cc | 37 ++++-- gdb/gdbserver/event-loop.c | 58 ++++++++- gdb/gdbserver/gdbthread.h | 4 +- gdb/gdbserver/inferiors.c | 57 +++++--- gdb/gdbserver/inferiors.h | 6 +- gdb/gdbserver/linux-aarch64-low.c | 11 +- gdb/gdbserver/linux-arm-low.c | 30 +++-- gdb/gdbserver/linux-cris-low.c | 4 +- gdb/gdbserver/linux-crisv32-low.c | 15 ++- gdb/gdbserver/linux-low.c | 279 +++++++++++++++++++++---------------- gdb/gdbserver/linux-mips-low.c | 21 ++- gdb/gdbserver/linux-nios2-low.c | 3 +- gdb/gdbserver/linux-s390-low.c | 3 +- gdb/gdbserver/linux-sparc-low.c | 3 +- gdb/gdbserver/linux-tile-low.c | 3 +- gdb/gdbserver/linux-x86-low.c | 40 ++++-- gdb/gdbserver/lynx-low.c | 21 ++- gdb/gdbserver/mem-break.c | 56 +++++--- gdb/gdbserver/nto-low.c | 20 ++- gdb/gdbserver/proc-service.c | 13 +- gdb/gdbserver/regcache.c | 23 ++-- gdb/gdbserver/remote-utils.c | 126 +++++++++++------ gdb/gdbserver/remote-utils.h | 2 +- gdb/gdbserver/server.c | 168 +++++++++++++++-------- gdb/gdbserver/server.h | 28 ++-- gdb/gdbserver/target.c | 4 +- gdb/gdbserver/tdesc.c | 4 +- gdb/gdbserver/thread-db.c | 30 +++-- gdb/gdbserver/tracepoint.c | 13 +- gdb/gdbserver/win32-i386-low.c | 17 ++- gdb/gdbserver/win32-low.c | 37 ++++-- 31 files changed, 729 insertions(+), 407 deletions(-) First 500 lines of diff: diff --git a/gdb/gdbserver/dyninst-low.cc b/gdb/gdbserver/dyninst-low.cc index fec8825..be4d6ef 100644 --- a/gdb/gdbserver/dyninst-low.cc +++ b/gdb/gdbserver/dyninst-low.cc @@ -359,16 +359,18 @@ void dyninst_add_thread(int pid, Thread::const_ptr thread) { Dyninst::LWP lwp; + client_state *cs = get_client_state (); + if (thread != NULL) { struct thread_info_private *tip = new struct thread_info_private; tip->thread = thread; lwp = thread->getLWP(); - current_thread = add_thread (ptid_build (pid, lwp, 0), tip); + cs->current_thread = add_thread (ptid_build (pid, lwp, 0), tip); } else { - current_thread = add_thread (ptid_build (pid, pid, 0), NULL); + cs->current_thread = add_thread (ptid_build (pid, pid, 0), NULL); } } @@ -378,9 +380,11 @@ dyninst_add_thread(int pid, Thread::const_ptr thread) static Thread::const_ptr dyninst_get_inferior_thread() { - DEBUG("current_thread=" << current_thread); - struct thread_info_private *tip = (struct thread_info_private*)(current_thread->target_data); - DEBUG("", pid_to_string (current_thread->entry.id)); + client_state *cs = get_client_state (); + + DEBUG("current_thread=" << cs->current_thread); + struct thread_info_private *tip = (struct thread_info_private*)(cs->current_thread->target_data); + DEBUG("", pid_to_string (cs->current_thread->entry.id)); if (!tip) error ("No inferior thread"); return tip->thread; @@ -564,13 +568,16 @@ dyninst_attach (unsigned long pid) static void dyninst_resume (struct thread_resume *resume_info, size_t n) { + client_state *cs = get_client_state (); + + for (int i = 0; i < (int)n; i++) { DEBUG("",pid_to_string(resume_info[i].thread)); ptid_t ptid = resume_info[i].thread; if (ptid_equal (ptid, minus_one_ptid)) - ptid = thread_to_gdb_id (current_thread); + ptid = thread_to_gdb_id (cs->current_thread); Dyninst::PID pid = ptid_get_pid (ptid); ProcessSet::iterator procset_it = dyninst_procset->find(pid); @@ -657,8 +664,10 @@ dyninst_continue (ptid_t ptid) bool in_step_range () { - struct thread_info_private *tip = (struct thread_info_private*)(current_thread->target_data); - struct regcache *regcache = get_thread_regcache (current_thread, 1); + client_state *cs = get_client_state (); + + struct thread_info_private *tip = (struct thread_info_private*)(cs->current_thread->target_data); + struct regcache *regcache = get_thread_regcache (cs->current_thread, 1); CORE_ADDR pc = (*the_low_target.get_pc) (regcache); return (pc >= tip->step_range_start && pc < tip->step_range_end); @@ -673,6 +682,7 @@ dyninst_wait_1 (ptid_t ptid, struct target_waitstatus *status, int options) ptid_t new_ptid = ptid; Dyninst::PID pid = ptid.pid; bool thread_created = false; + client_state *cs = get_client_state (); DEBUG("", pid_to_string (ptid)); @@ -768,8 +778,8 @@ dyninst_wait_1 (ptid_t ptid, struct target_waitstatus *status, int options) break; } - DEBUG("returning", pid_to_string (ptid_of(current_thread))); - return ptid_of (current_thread); + DEBUG("returning", pid_to_string (ptid_of(cs->current_thread))); + return ptid_of (cs->current_thread); // return new_ptid; } @@ -1028,7 +1038,9 @@ dyninst_write_memory (CORE_ADDR memaddr, const unsigned char *myaddr, int len) static void dyninst_request_interrupt (void) { - Dyninst::PID pid = ptid_get_pid (thread_to_gdb_id (current_thread)); + client_state *cs = get_client_state (); + + Dyninst::PID pid = ptid_get_pid (thread_to_gdb_id (cs->current_thread)); ProcessSet::iterator procset_it = dyninst_procset->find(pid); Process::ptr dyninst_process = *procset_it; @@ -1045,7 +1057,8 @@ dyninst_read_auxv (CORE_ADDR offset, unsigned char *myaddr, unsigned int len) { char filename[PATH_MAX]; int fd, n; - int pid = lwpid_of (current_thread); + client_state *cs = get_client_state (); + int pid = lwpid_of (cs->current_thread); xsnprintf (filename, sizeof filename, "/proc/%d/auxv", pid); diff --git a/gdb/gdbserver/event-loop.c b/gdb/gdbserver/event-loop.c index 92c8db0..7185c02 100644 --- a/gdb/gdbserver/event-loop.c +++ b/gdb/gdbserver/event-loop.c @@ -23,6 +23,9 @@ #include #include +#include +#include +#include #ifdef USE_WIN32API #include @@ -160,6 +163,7 @@ initialize_event_loop (void) event_queue = QUEUE_alloc (gdb_event_p, gdb_event_xfree); } + /* Process one event. If an event was processed, 1 is returned otherwise 0 is returned. Scan the queue from head to tail, processing therefore the high priority events first, by invoking @@ -277,6 +281,8 @@ create_file_handler (gdb_fildes_t fd, int mask, handler_func *proc, { file_handler *file_ptr; + if (debug_threads) + fprintf (stderr,"%s matched fd %d\n",__FUNCTION__,fd); /* Do we already have a file handler for this file? (We may be changing its associated procedure). */ for (file_ptr = gdb_notifier.first_file_handler; @@ -337,6 +343,8 @@ delete_file_handler (gdb_fildes_t fd) file_handler *file_ptr, *prev_ptr = NULL; int i; + if (debug_threads) + fprintf (stderr,"%s matched fd %d\n",__FUNCTION__,fd); /* Find the entry for the given file. */ for (file_ptr = gdb_notifier.first_file_handler; @@ -426,6 +434,7 @@ handle_file_event (gdb_fildes_t event_file_desc) /* If there was a match, then call the handler. */ if (mask != 0) { + set_client_state (file_ptr->fd); if ((*file_ptr->proc) (file_ptr->error, file_ptr->client_data) < 0) return -1; @@ -459,12 +468,46 @@ create_file_event (gdb_fildes_t fd) select. Return -1 if there are no files descriptors to monitor, otherwise return 0. */ +int get_remote_desc(); +int get_listen_desc(); + static int wait_for_event (void) { file_handler *file_ptr; int num_found = 0; + // + fd_set conn_fd_set; + struct timeval timeout; + FD_ZERO(&conn_fd_set); + FD_SET(get_listen_desc(),&conn_fd_set); + timeout.tv_sec = 0; + timeout.tv_usec = 10; + num_found = select (FD_SETSIZE, &conn_fd_set, NULL, NULL, &timeout); + fprintf (stderr,"%s select fd=%d found=%d\n",__FUNCTION__,get_listen_desc(),num_found); + if (num_found > 0) + { + int i; + for (i = 1; i < FD_SETSIZE; ++i) + if (FD_ISSET (i, &conn_fd_set)) + { + if (i == get_listen_desc()) + { + int handle_accept_event (int, gdb_client_data); + if (debug_threads) + fprintf (stderr,"%s in select idx %d\n",__FUNCTION__,i); + // instead of using gdb_event just setup the connection "by hand" + handle_accept_event (0, NULL); + add_file_handler (get_remote_desc(), handle_serial_event, get_client_state()); + } + else + if (debug_threads) + fprintf (stderr,"%s data arrived on existing connection %d fd=%d\n", __FUNCTION__, i,get_listen_desc()); + } + } + // + /* Make sure all output is done before getting another event. */ fflush (stdout); fflush (stderr); @@ -481,6 +524,10 @@ wait_for_event (void) &gdb_notifier.ready_masks[2], NULL); + if (debug_threads) + fprintf(stderr,"select num_fds %d returned %d\n",gdb_notifier.num_fds,num_found); + if (num_found < 0) + perror(__FUNCTION__); /* Clear the masks after an error from select. */ if (num_found == -1) { @@ -496,7 +543,7 @@ wait_for_event (void) } /* Enqueue all detected file events. */ - + fprintf (stderr,"%s 1 #fds=%d\n",__FUNCTION__,gdb_notifier.num_fds); for (file_ptr = gdb_notifier.first_file_handler; file_ptr != NULL && num_found > 0; file_ptr = file_ptr->next_file) @@ -520,8 +567,11 @@ wait_for_event (void) if (file_ptr->ready_mask == 0) { + int handle_accept_event (int err, gdb_client_data client_data); gdb_event *file_event_ptr = create_file_event (file_ptr->fd); - + fprintf (stderr,"%s 2 #fds=%d\n",__FUNCTION__,gdb_notifier.num_fds); + if (debug_threads) + fprintf(stderr,"%s create_file_event for %d %#lx %#lx %#lx %#lx\n",__FUNCTION__,file_event_ptr->fd,(long unsigned int)file_ptr->proc,(long unsigned int)handle_file_event,(long unsigned int)handle_serial_event,(long unsigned int)handle_accept_event); QUEUE_enque (gdb_event_p, event_queue, file_event_ptr); } file_ptr->ready_mask = mask; @@ -545,6 +595,8 @@ start_event_loop (void) { /* Any events already waiting in the queue? */ int res = process_event (); + if (debug_threads) + fprintf (stderr, "COX After process_event\n"); /* Did the event handler want the event loop to stop? */ if (res == -1) @@ -568,6 +620,8 @@ start_event_loop (void) sources left. This will make the event loop stop, and the application exit. */ + if (debug_threads) + fprintf (stderr, "COX Before start_event_loop return\n"); if (wait_for_event () < 0) return; } diff --git a/gdb/gdbserver/gdbthread.h b/gdb/gdbserver/gdbthread.h index 8290ec1..7ae481b 100644 --- a/gdb/gdbserver/gdbthread.h +++ b/gdb/gdbserver/gdbthread.h @@ -70,7 +70,7 @@ struct thread_info struct btrace_target_info *btrace; }; -extern struct inferior_list all_threads; +// extern struct inferior_list cs->all_threads; void remove_thread (struct thread_info *thread); struct thread_info *add_thread (ptid_t ptid, void *target_data); @@ -80,6 +80,6 @@ struct thread_info *get_first_thread (void); struct thread_info *find_thread_ptid (ptid_t ptid); /* Get current thread ID (Linux task ID). */ -#define current_ptid (current_thread->entry.id) +#define current_ptid ({client_state *cs = get_client_state (); cs->current_thread->entry.id;}) #endif /* GDB_THREAD_H */ diff --git a/gdb/gdbserver/inferiors.c b/gdb/gdbserver/inferiors.c index 379c51d..3b150ac 100644 --- a/gdb/gdbserver/inferiors.c +++ b/gdb/gdbserver/inferiors.c @@ -22,10 +22,10 @@ #include "gdbthread.h" #include "dll.h" -struct inferior_list all_processes; -struct inferior_list all_threads; +// struct inferior_list all_processes; +// struct inferior_list all_threads; -struct thread_info *current_thread; +// struct thread_info *cs->current_thread; #define get_thread(inf) ((struct thread_info *)(inf)) @@ -106,6 +106,7 @@ struct thread_info * add_thread (ptid_t thread_id, void *target_data) { struct thread_info *new_thread = xmalloc (sizeof (*new_thread)); + client_state *cs = get_client_state (); memset (new_thread, 0, sizeof (*new_thread)); @@ -113,10 +114,10 @@ add_thread (ptid_t thread_id, void *target_data) new_thread->last_resume_kind = resume_continue; new_thread->last_status.kind = TARGET_WAITKIND_IGNORE; - add_inferior_to_list (&all_threads, &new_thread->entry); + add_inferior_to_list (&cs->all_threads, &new_thread->entry); - if (current_thread == NULL) - current_thread = new_thread; + if (cs->current_thread == NULL) + cs->current_thread = new_thread; new_thread->target_data = target_data; @@ -134,13 +135,17 @@ thread_to_gdb_id (struct thread_info *thread) struct thread_info * get_first_thread (void) { - return (struct thread_info *) get_first_inferior (&all_threads); + client_state *cs = get_client_state (); + + return (struct thread_info *) get_first_inferior (&cs->all_threads); } struct thread_info * find_thread_ptid (ptid_t ptid) { - return (struct thread_info *) find_inferior_id (&all_threads, ptid); + client_state *cs = get_client_state (); + + return (struct thread_info *) find_inferior_id (&cs->all_threads, ptid); } ptid_t @@ -162,10 +167,12 @@ free_one_thread (struct inferior_list_entry *inf) void remove_thread (struct thread_info *thread) { + client_state *cs = get_client_state (); + if (thread->btrace != NULL) target_disable_btrace (thread->btrace); - remove_inferior (&all_threads, (struct inferior_list_entry *) thread); + remove_inferior (&cs->all_threads, (struct inferior_list_entry *) thread); free_one_thread (&thread->entry); } @@ -262,25 +269,28 @@ clear_inferior_list (struct inferior_list *list) void clear_inferiors (void) { - for_each_inferior (&all_threads, free_one_thread); - clear_inferior_list (&all_threads); + client_state *cs = get_client_state (); + + for_each_inferior (&cs->all_threads, free_one_thread); + clear_inferior_list (&cs->all_threads); clear_dlls (); - current_thread = NULL; + cs->current_thread = NULL; } struct process_info * add_process (int pid, int attached) { struct process_info *process; + client_state *cs = get_client_state (); process = xcalloc (1, sizeof (*process)); process->entry.id = pid_to_ptid (pid); process->attached = attached; - add_inferior_to_list (&all_processes, &process->entry); + add_inferior_to_list (&cs->all_processes, &process->entry); return process; } @@ -292,17 +302,21 @@ add_process (int pid, int attached) void remove_process (struct process_info *process) { + client_state *cs = get_client_state (); + clear_symbol_cache (&process->symbol_cache); free_all_breakpoints (process); - remove_inferior (&all_processes, &process->entry); + remove_inferior (&cs->all_processes, &process->entry); free (process); } struct process_info * find_process_pid (int pid) { + client_state *cs = get_client_state (); + return (struct process_info *) - find_inferior_id (&all_processes, pid_to_ptid (pid)); + find_inferior_id (&cs->all_processes, pid_to_ptid (pid)); } /* Return non-zero if INF, a struct process_info, was started by us, @@ -322,7 +336,9 @@ started_inferior_callback (struct inferior_list_entry *entry, void *args) int have_started_inferiors_p (void) { - return (find_inferior (&all_processes, started_inferior_callback, NULL) + client_state *cs = get_client_state (); + + return (find_inferior (&cs->all_processes, started_inferior_callback, NULL) != NULL); } @@ -341,7 +357,9 @@ attached_inferior_callback (struct inferior_list_entry *entry, void *args) int have_attached_inferiors_p (void) { - return (find_inferior (&all_processes, attached_inferior_callback, NULL) + client_state *cs = get_client_state (); + + return (find_inferior (&cs->all_processes, attached_inferior_callback, NULL) != NULL); } @@ -355,6 +373,7 @@ get_thread_process (struct thread_info *thread) struct process_info * current_process (void) { - gdb_assert (current_thread != NULL); - return get_thread_process (current_thread); + client_state *cs = get_client_state (); + gdb_assert (cs->current_thread != NULL); + return get_thread_process (cs->current_thread); } diff --git a/gdb/gdbserver/inferiors.h b/gdb/gdbserver/inferiors.h index f99947b..e244b9a 100644 --- a/gdb/gdbserver/inferiors.h +++ b/gdb/gdbserver/inferiors.h @@ -83,7 +83,7 @@ struct process_info struct process_info *current_process (void); struct process_info *get_thread_process (struct thread_info *); -extern struct inferior_list all_processes; +// extern struct inferior_list cs->all_processes; void add_inferior_to_list (struct inferior_list *list, struct inferior_list_entry *new_inferior); @@ -119,9 +119,9 @@ int one_inferior_p (struct inferior_list *list); /* Iterate over all processes, open loop style. */ #define ALL_PROCESSES(cur, tmp) \ - ALL_INFERIORS_TYPE (struct process_info, &all_processes, cur, tmp) + ALL_INFERIORS_TYPE (struct process_info, &cs->all_processes, cur, tmp) -extern struct thread_info *current_thread; +// extern struct thread_info *current_thread; void remove_inferior (struct inferior_list *list, struct inferior_list_entry *entry); diff --git a/gdb/gdbserver/linux-aarch64-low.c b/gdb/gdbserver/linux-aarch64-low.c index 01dff7f..93eb4f5 100644 --- a/gdb/gdbserver/linux-aarch64-low.c +++ b/gdb/gdbserver/linux-aarch64-low.c @@ -695,14 +695,15 @@ aarch64_notify_debug_reg_change (const struct aarch64_debug_reg_state *state, int is_watchpoint, unsigned int idx) { struct aarch64_dr_update_callback_param param; + client_state *cs = get_client_state (); /* Only update the threads of this process. */ - param.pid = pid_of (current_thread); + param.pid = pid_of (cs->current_thread); param.is_watchpoint = is_watchpoint; param.idx = idx; - find_inferior (&all_threads, debug_reg_change_callback, (void *) ¶m); + find_inferior (&cs->all_threads, debug_reg_change_callback, (void *) ¶m); } @@ -1037,8 +1038,9 @@ aarch64_stopped_data_address (void) siginfo_t siginfo; int pid, i; struct aarch64_debug_reg_state *state; + client_state *cs = get_client_state (); - pid = lwpid_of (current_thread); + pid = lwpid_of (cs->current_thread); /* Get the siginfo. */ if (ptrace (PTRACE_GETSIGINFO, pid, NULL, &siginfo) != 0) @@ -1183,10 +1185,11 @@ aarch64_arch_setup (void) hooks/post-receive -- Repository for Project Archer.