From f8c1d06b82ab0fd56bcffc9030cb44b5a946113e Mon Sep 17 00:00:00 2001 From: Gary Benson Date: Thu, 11 Sep 2014 11:19:56 +0100 Subject: [PATCH] Introduce target_{stop,continue}_ptid This commit introduces two new functions to stop and restart target processes that shared code can use and that clients must implement. It also changes some shared code to use these functions. gdb/ChangeLog: * target/target.h (target_stop_ptid, target_continue_ptid): Declare. * target.c (target_stop_ptid, target_continue_ptid): New functions. * common/agent.c [!GDBSERVER]: Don't include infrun.h. (agent_run_command): Always use target_stop_ptid and target_continue_ptid. gdb/gdbserver/ChangeLog: * target.c (target_stop_ptid, target_continue_ptid): New functions. --- gdb/ChangeLog | 10 ++++++++++ gdb/common/agent.c | 37 ++----------------------------------- gdb/gdbserver/ChangeLog | 5 +++++ gdb/gdbserver/target.c | 32 ++++++++++++++++++++++++++++++++ gdb/target.c | 25 +++++++++++++++++++++++++ gdb/target/target.h | 11 +++++++++++ 6 files changed, 85 insertions(+), 35 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index dda7ed96dbb..3dadc783817 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2014-09-11 Gary Benson + + * target/target.h (target_stop_ptid, target_continue_ptid): + Declare. + * target.c (target_stop_ptid, target_continue_ptid): New + functions. + * common/agent.c [!GDBSERVER]: Don't include infrun.h. + (agent_run_command): Always use target_stop_ptid and + target_continue_ptid. + 2014-09-11 Tom Tromey Gary Benson diff --git a/gdb/common/agent.c b/gdb/common/agent.c index 9f8ea9a4691..0ac73a9591c 100644 --- a/gdb/common/agent.c +++ b/gdb/common/agent.c @@ -21,7 +21,6 @@ #include "server.h" #else #include "defs.h" -#include "infrun.h" #include "objfiles.h" #endif #include "target/target.h" @@ -218,18 +217,7 @@ agent_run_command (int pid, const char *cmd, int len) DEBUG_AGENT ("agent: resumed helper thread\n"); /* Resume helper thread. */ -#ifdef GDBSERVER -{ - struct thread_resume resume_info; - - resume_info.thread = ptid; - resume_info.kind = resume_continue; - resume_info.sig = GDB_SIGNAL_0; - (*the_target->resume) (&resume_info, 1); -} -#else - target_resume (ptid, 0, GDB_SIGNAL_0); -#endif + target_continue_ptid (ptid); fd = gdb_connect_sync_socket (pid); if (fd >= 0) @@ -261,30 +249,9 @@ agent_run_command (int pid, const char *cmd, int len) /* Need to read response with the inferior stopped. */ if (!ptid_equal (ptid, null_ptid)) { - struct target_waitstatus status; - int was_non_stop = non_stop; /* Stop thread PTID. */ DEBUG_AGENT ("agent: stop helper thread\n"); -#ifdef GDBSERVER - { - struct thread_resume resume_info; - - resume_info.thread = ptid; - resume_info.kind = resume_stop; - resume_info.sig = GDB_SIGNAL_0; - (*the_target->resume) (&resume_info, 1); - } - - non_stop = 1; - mywait (ptid, &status, 0, 0); -#else - non_stop = 1; - target_stop (ptid); - - memset (&status, 0, sizeof (status)); - target_wait (ptid, &status, 0); -#endif - non_stop = was_non_stop; + target_stop_ptid (ptid); } if (fd >= 0) diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index f2f63b4dd78..8a5ee1f125b 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,8 @@ +2014-09-11 Gary Benson + + * target.c (target_stop_ptid, target_continue_ptid): New + functions. + 2014-09-11 Tom Tromey Gary Benson diff --git a/gdb/gdbserver/target.c b/gdb/gdbserver/target.c index 08506e516bc..e51b7db5e89 100644 --- a/gdb/gdbserver/target.c +++ b/gdb/gdbserver/target.c @@ -134,6 +134,38 @@ mywait (ptid_t ptid, struct target_waitstatus *ourstatus, int options, return ret; } +/* See target/target.h. */ + +void +target_stop_ptid (ptid_t ptid) +{ + struct target_waitstatus status; + int was_non_stop = non_stop; + struct thread_resume resume_info; + + resume_info.thread = ptid; + resume_info.kind = resume_stop; + resume_info.sig = GDB_SIGNAL_0; + (*the_target->resume) (&resume_info, 1); + + non_stop = 1; + mywait (ptid, &status, 0, 0); + non_stop = was_non_stop; +} + +/* See target/target.h. */ + +void +target_continue_ptid (ptid_t ptid) +{ + struct thread_resume resume_info; + + resume_info.thread = ptid; + resume_info.kind = resume_continue; + resume_info.sig = GDB_SIGNAL_0; + (*the_target->resume) (&resume_info, 1); +} + int start_non_stop (int nonstop) { diff --git a/gdb/target.c b/gdb/target.c index 711e7cb7052..339b1d14e64 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -3027,6 +3027,31 @@ target_stop (ptid_t ptid) (*current_target.to_stop) (¤t_target, ptid); } +/* See target/target.h. */ + +void +target_stop_ptid (ptid_t ptid) +{ + struct target_waitstatus status; + int was_non_stop = non_stop; + + non_stop = 1; + target_stop (ptid); + + memset (&status, 0, sizeof (status)); + target_wait (ptid, &status, 0); + + non_stop = was_non_stop; +} + +/* See target/target.h. */ + +void +target_continue_ptid (ptid_t ptid) +{ + target_resume (ptid, 0, GDB_SIGNAL_0); +} + /* Concatenate ELEM to LIST, a comma separate list, and return the result. The LIST incoming argument is released. */ diff --git a/gdb/target/target.h b/gdb/target/target.h index 0a3c4b7d4e7..99a79667e23 100644 --- a/gdb/target/target.h +++ b/gdb/target/target.h @@ -59,4 +59,15 @@ extern int target_read_uint32 (CORE_ADDR memaddr, uint32_t *result); extern int target_write_memory (CORE_ADDR memaddr, const gdb_byte *myaddr, ssize_t len); +/* Make target stop in a continuable fashion. (For instance, under + Unix, this should act like SIGSTOP). This function must be + provided by the client. */ + +extern void target_stop_ptid (ptid_t ptid); + +/* Restart a target that was previously stopped by target_stop_ptid. + This function must be provided by the client. */ + +extern void target_continue_ptid (ptid_t ptid); + #endif /* TARGET_COMMON_H */ -- 2.30.2