From: Pedro Alves <pedro@codesourcery.com>
To: gdb-patches@sourceware.org
Subject: Get rid of ATTACH_NO_WAIT
Date: Sat, 28 Jun 2008 00:15:00 -0000 [thread overview]
Message-ID: <200806280018.59156.pedro@codesourcery.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 586 bytes --]
As I described in the email I just sent, ATTACH_NO_WAIT being a host
macro, is wrong to be applied to other targets other than the
native target. Due to it, the "target extended-remote; attach" sequence
behaves differently depending on the host.
This patch replaces the macro by a target property.
The only hosts that define it currently are Windows hosts,
and GNU Hurd. I've tested the patch on
x86_64-unknown-linux-gnu {native/gdbserver}
and x86-pc-cygwin {native/gdbserver}. I don't have access
to a Hurd system, but the change seems pretty obvious to me.
OK?
--
Pedro Alves
[-- Attachment #2: attach_no_wait.diff --]
[-- Type: text/x-diff, Size: 7334 bytes --]
2008-06-28 Pedro Alves <pedro@codesourcery.com>
* config/i386/nm-cygwin.h (ATTACH_NO_WAIT): Delete.
* config/i386/nm-i386gnu.h (ATTACH_NO_WAIT): Delete.
* target.h (struct target_ops): Add to_attach_no_wait member.
(target_attach_no_wait): New.
* target.c (update_current_target): Inherit to_attach_no_wait.
* infcmd.c: Replace ATTACH_NO_WAIT compile time check by
target_attach_no_wait runtime check.
* gnu-nat.c (init_gnu_ops): Set to_attach_no_wait in gnu_ops.
* win32-nat.c (init_win32_ops): Set to_attach_no_wait in
win32_ops.
---
gdb/config/i386/nm-cygwin.h | 1
gdb/config/i386/nm-i386gnu.h | 3 --
gdb/gnu-nat.c | 1
gdb/infcmd.c | 60 ++++++++++++++++++++++---------------------
gdb/remote.c | 1
gdb/target.c | 1
gdb/target.h | 8 +++++
gdb/win32-nat.c | 1
8 files changed, 43 insertions(+), 33 deletions(-)
Index: src/gdb/config/i386/nm-cygwin.h
===================================================================
--- src.orig/gdb/config/i386/nm-cygwin.h
+++ src/gdb/config/i386/nm-cygwin.h
@@ -16,7 +16,6 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
-#define ATTACH_NO_WAIT
#define ADD_SHARED_SYMBOL_FILES dll_symbol_command
void dll_symbol_command (char *, int);
Index: src/gdb/config/i386/nm-i386gnu.h
===================================================================
--- src.orig/gdb/config/i386/nm-i386gnu.h
+++ src/gdb/config/i386/nm-i386gnu.h
@@ -26,9 +26,6 @@
extern char *gnu_target_pid_to_str (int pid);
-/* Don't do wait_for_inferior on attach. */
-#define ATTACH_NO_WAIT
-
/* Thread flavors used in re-setting the T bit. */
#define THREAD_STATE_FLAVOR i386_REGS_SEGS_STATE
#define THREAD_STATE_SIZE i386_THREAD_STATE_COUNT
Index: src/gdb/gnu-nat.c
===================================================================
--- src.orig/gdb/gnu-nat.c
+++ src/gdb/gnu-nat.c
@@ -2592,6 +2592,7 @@ init_gnu_ops (void)
gnu_ops.to_doc = "GNU Hurd process"; /* to_doc */
gnu_ops.to_open = gnu_open; /* to_open */
gnu_ops.to_attach = gnu_attach; /* to_attach */
+ gnu_ops.to_attach_no_wait = 1; /* to_attach_no_wait */
gnu_ops.to_detach = gnu_detach; /* to_detach */
gnu_ops.to_resume = gnu_resume; /* to_resume */
gnu_ops.to_wait = gnu_wait; /* to_wait */
Index: src/gdb/infcmd.c
===================================================================
--- src.orig/gdb/infcmd.c
+++ src/gdb/infcmd.c
@@ -2014,38 +2014,40 @@ attach_command (char *args, int from_tty
init_wait_for_inferior ();
clear_proceed_status ();
- /* No traps are generated when attaching to inferior under Mach 3
- or GNU hurd. */
-#ifndef ATTACH_NO_WAIT
- /* Careful here. See comments in inferior.h. Basically some OSes
- don't ignore SIGSTOPs on continue requests anymore. We need a
- way for handle_inferior_event to reset the stop_signal variable
- after an attach, and this is what STOP_QUIETLY_NO_SIGSTOP is for. */
- stop_soon = STOP_QUIETLY_NO_SIGSTOP;
-
- if (target_can_async_p ())
+ /* Some system don't generate traps when attaching to inferior.
+ E.g. Mach 3 or GNU hurd. */
+ if (!target_attach_no_wait)
{
- /* sync_execution mode. Wait for stop. */
- struct continuation_arg *arg1, *arg2, *arg3;
+ /* Careful here. See comments in inferior.h. Basically some
+ OSes don't ignore SIGSTOPs on continue requests anymore. We
+ need a way for handle_inferior_event to reset the stop_signal
+ variable after an attach, and this is what
+ STOP_QUIETLY_NO_SIGSTOP is for. */
+ stop_soon = STOP_QUIETLY_NO_SIGSTOP;
- arg1 =
- (struct continuation_arg *) xmalloc (sizeof (struct continuation_arg));
- arg2 =
- (struct continuation_arg *) xmalloc (sizeof (struct continuation_arg));
- arg3 =
- (struct continuation_arg *) xmalloc (sizeof (struct continuation_arg));
- arg1->next = arg2;
- arg2->next = arg3;
- arg3->next = NULL;
- arg1->data.pointer = args;
- arg2->data.integer = from_tty;
- arg3->data.integer = async_exec;
- add_continuation (attach_command_continuation, arg1);
- return;
- }
+ if (target_can_async_p ())
+ {
+ /* sync_execution mode. Wait for stop. */
+ struct continuation_arg *arg1, *arg2, *arg3;
- wait_for_inferior (0);
-#endif
+ arg1 =
+ (struct continuation_arg *) xmalloc (sizeof (struct continuation_arg));
+ arg2 =
+ (struct continuation_arg *) xmalloc (sizeof (struct continuation_arg));
+ arg3 =
+ (struct continuation_arg *) xmalloc (sizeof (struct continuation_arg));
+ arg1->next = arg2;
+ arg2->next = arg3;
+ arg3->next = NULL;
+ arg1->data.pointer = args;
+ arg2->data.integer = from_tty;
+ arg3->data.integer = async_exec;
+ add_continuation (attach_command_continuation, arg1);
+ return;
+ }
+
+ wait_for_inferior (0);
+ }
attach_command_post_wait (args, from_tty, async_exec);
}
Index: src/gdb/target.h
===================================================================
--- src.orig/gdb/target.h
+++ src/gdb/target.h
@@ -407,6 +407,7 @@ struct target_ops
int to_has_registers;
int to_has_execution;
int to_has_thread_control; /* control thread execution */
+ int to_attach_no_wait;
struct section_table
*to_sections;
struct section_table
@@ -559,6 +560,13 @@ void target_close (struct target_ops *ta
#define target_attach(args, from_tty) \
(*current_target.to_attach) (args, from_tty)
+/* Some targets don't generate traps when attaching to the inferior,
+ or their target_attach implementation takes care of the waiting.
+ These targets must set to_attach_no_wait. */
+
+#define target_attach_no_wait \
+ (current_target.to_attach_no_wait)
+
/* The target_attach operation places a process under debugger control,
and stops the process.
Index: src/gdb/win32-nat.c
===================================================================
--- src.orig/gdb/win32-nat.c
+++ src/gdb/win32-nat.c
@@ -2080,6 +2080,7 @@ init_win32_ops (void)
win32_ops.to_open = win32_open;
win32_ops.to_close = win32_close;
win32_ops.to_attach = win32_attach;
+ win32_ops.to_attach_no_wait = 1;
win32_ops.to_detach = win32_detach;
win32_ops.to_resume = win32_resume;
win32_ops.to_wait = win32_wait;
Index: src/gdb/target.c
===================================================================
--- src.orig/gdb/target.c
+++ src/gdb/target.c
@@ -406,6 +406,7 @@ update_current_target (void)
INHERIT (to_close, t);
INHERIT (to_attach, t);
INHERIT (to_post_attach, t);
+ INHERIT (to_attach_no_wait, t);
INHERIT (to_detach, t);
/* Do not inherit to_disconnect. */
INHERIT (to_resume, t);
Index: src/gdb/remote.c
===================================================================
--- src.orig/gdb/remote.c
+++ src/gdb/remote.c
@@ -7099,6 +7099,7 @@ Specify the serial device it is connecte
extended_remote_ops.to_mourn_inferior = extended_remote_mourn;
extended_remote_ops.to_detach = extended_remote_detach;
extended_remote_ops.to_attach = extended_remote_attach;
+ extended_remote_ops.to_attach_no_wait = 0;
}
static int
next reply other threads:[~2008-06-27 23:19 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-06-28 0:15 Pedro Alves [this message]
2008-06-28 1:00 ` Pedro Alves
2008-07-03 16:48 ` Joel Brobecker
2008-07-03 17:13 ` Pedro Alves
2008-07-03 17:29 ` Joel Brobecker
2008-07-03 17:41 ` Pedro Alves
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200806280018.59156.pedro@codesourcery.com \
--to=pedro@codesourcery.com \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox