From 9908b56683c3fce81b58ff5ee888741790f516d0 Mon Sep 17 00:00:00 2001 From: Vladimir Prus Date: Tue, 19 Aug 2008 13:22:14 +0000 Subject: [PATCH] Make sure target supports non-stop. * infcmd.c (run_command_1, attach_command): If non-stop mode is requested, verify the target supports it. * linux-nat.c (linux_nat_supports_non_stop): New. (linux_nat_add_target): Register the above. * target.c (find_default_supports_non_stop) (target_supports_non_stop): New. (init_dummy_target): Register find_default_supports_non_stop. * target.h (struct target_ops): New field to_supports_non_stop. (target_supports_non_stop): New. --- gdb/ChangeLog | 13 +++++++++++++ gdb/infcmd.c | 6 ++++++ gdb/linux-nat.c | 7 +++++++ gdb/target.c | 24 ++++++++++++++++++++++++ gdb/target.h | 3 +++ 5 files changed, 53 insertions(+) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 7b3564e9190..35bd2acda73 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,16 @@ +2008-08-19 Vladimir Prus + + Make sure target supports non-stop. + * infcmd.c (run_command_1, attach_command): If non-stop mode + is requested, verify the target supports it. + * linux-nat.c (linux_nat_supports_non_stop): New. + (linux_nat_add_target): Register the above. + * target.c (find_default_supports_non_stop) + (target_supports_non_stop): New. + (init_dummy_target): Register find_default_supports_non_stop. + * target.h (struct target_ops): New field to_supports_non_stop. + (target_supports_non_stop): New. + 2008-08-19 Pedro Alves Vladimir Prus diff --git a/gdb/infcmd.c b/gdb/infcmd.c index 82d4710d1dd..02ec980d6aa 100644 --- a/gdb/infcmd.c +++ b/gdb/infcmd.c @@ -503,6 +503,9 @@ run_command_1 (char *args, int from_tty, int tbreak_at_main) exec_file = (char *) get_exec_file (0); + if (non_stop && !target_supports_non_stop ()) + error (_("The target does not support running in non-stop mode.")); + /* We keep symbols from add-symbol-file, on the grounds that the user might want to add some symbols before running the program (right?). But sometimes (dynamic loading where the user manually @@ -2020,6 +2023,9 @@ attach_command (char *args, int from_tty) this function should probably be moved into target_pre_inferior. */ target_pre_inferior (from_tty); + if (non_stop && !target_supports_non_stop ()) + error (_("Cannot attach to this target in non-stop mode")); + if (args) { async_exec = strip_bg_char (&args); diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c index b25104e86af..126f7dcb781 100644 --- a/gdb/linux-nat.c +++ b/gdb/linux-nat.c @@ -4018,6 +4018,12 @@ linux_nat_can_async_p (void) return linux_nat_async_mask_value; } +static int +linux_nat_supports_non_stop (void) +{ + return 1; +} + /* target_async_mask implementation. */ static int @@ -4374,6 +4380,7 @@ linux_nat_add_target (struct target_ops *t) t->to_can_async_p = linux_nat_can_async_p; t->to_is_async_p = linux_nat_is_async_p; + t->to_supports_non_stop = linux_nat_supports_non_stop; t->to_async = linux_nat_async; t->to_async_mask = linux_nat_async_mask; t->to_terminal_inferior = linux_nat_terminal_inferior; diff --git a/gdb/target.c b/gdb/target.c index e4699053f4f..1f658194d2e 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -2126,6 +2126,29 @@ find_default_is_async_p (void) return 0; } +int +find_default_supports_non_stop (void) +{ + struct target_ops *t; + + t = find_default_run_target (NULL); + if (t && t->to_supports_non_stop) + return (t->to_supports_non_stop) (); + return 0; +} + +int +target_supports_non_stop () +{ + struct target_ops *t; + for (t = ¤t_target; t != NULL; t = t->beneath) + if (t->to_supports_non_stop) + return t->to_supports_non_stop (); + + return 0; +} + + static int default_region_ok_for_hw_watchpoint (CORE_ADDR addr, int len) { @@ -2400,6 +2423,7 @@ init_dummy_target (void) dummy_target.to_create_inferior = find_default_create_inferior; dummy_target.to_can_async_p = find_default_can_async_p; dummy_target.to_is_async_p = find_default_is_async_p; + dummy_target.to_supports_non_stop = find_default_supports_non_stop; dummy_target.to_pid_to_str = normal_pid_to_str; dummy_target.to_stratum = dummy_stratum; dummy_target.to_find_memory_regions = dummy_find_memory_regions; diff --git a/gdb/target.h b/gdb/target.h index 350a7c4f9f1..067c031d8c9 100644 --- a/gdb/target.h +++ b/gdb/target.h @@ -422,6 +422,7 @@ struct target_ops int (*to_is_async_p) (void); void (*to_async) (void (*) (enum inferior_event_type, void *), void *); int (*to_async_mask) (int); + int (*to_supports_non_stop) (void); int (*to_find_memory_regions) (int (*) (CORE_ADDR, unsigned long, int, int, int, @@ -966,6 +967,8 @@ extern int target_async_permitted; /* Is the target in asynchronous execution mode? */ #define target_is_async_p() (current_target.to_is_async_p ()) +int target_supports_non_stop (void); + /* Put the target in async mode with the specified callback function. */ #define target_async(CALLBACK,CONTEXT) \ (current_target.to_async ((CALLBACK), (CONTEXT))) -- 2.30.2