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.
This commit is contained in:
Vladimir Prus 2008-08-19 13:22:14 +00:00
parent c6ebd6cf99
commit 9908b56683
5 changed files with 53 additions and 0 deletions

View file

@ -1,3 +1,16 @@
2008-08-19 Vladimir Prus <vladimir@codesourcery.com>
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 <pedro@codesourcery.com> 2008-08-19 Pedro Alves <pedro@codesourcery.com>
Vladimir Prus <vladimir@codesourcery.com> Vladimir Prus <vladimir@codesourcery.com>

View file

@ -503,6 +503,9 @@ run_command_1 (char *args, int from_tty, int tbreak_at_main)
exec_file = (char *) get_exec_file (0); 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 /* We keep symbols from add-symbol-file, on the grounds that the
user might want to add some symbols before running the program user might want to add some symbols before running the program
(right?). But sometimes (dynamic loading where the user manually (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. */ this function should probably be moved into target_pre_inferior. */
target_pre_inferior (from_tty); target_pre_inferior (from_tty);
if (non_stop && !target_supports_non_stop ())
error (_("Cannot attach to this target in non-stop mode"));
if (args) if (args)
{ {
async_exec = strip_bg_char (&args); async_exec = strip_bg_char (&args);

View file

@ -4018,6 +4018,12 @@ linux_nat_can_async_p (void)
return linux_nat_async_mask_value; return linux_nat_async_mask_value;
} }
static int
linux_nat_supports_non_stop (void)
{
return 1;
}
/* target_async_mask implementation. */ /* target_async_mask implementation. */
static int 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_can_async_p = linux_nat_can_async_p;
t->to_is_async_p = linux_nat_is_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 = linux_nat_async;
t->to_async_mask = linux_nat_async_mask; t->to_async_mask = linux_nat_async_mask;
t->to_terminal_inferior = linux_nat_terminal_inferior; t->to_terminal_inferior = linux_nat_terminal_inferior;

View file

@ -2126,6 +2126,29 @@ find_default_is_async_p (void)
return 0; 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 = &current_target; t != NULL; t = t->beneath)
if (t->to_supports_non_stop)
return t->to_supports_non_stop ();
return 0;
}
static int static int
default_region_ok_for_hw_watchpoint (CORE_ADDR addr, int len) 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_create_inferior = find_default_create_inferior;
dummy_target.to_can_async_p = find_default_can_async_p; 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_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_pid_to_str = normal_pid_to_str;
dummy_target.to_stratum = dummy_stratum; dummy_target.to_stratum = dummy_stratum;
dummy_target.to_find_memory_regions = dummy_find_memory_regions; dummy_target.to_find_memory_regions = dummy_find_memory_regions;

View file

@ -422,6 +422,7 @@ struct target_ops
int (*to_is_async_p) (void); int (*to_is_async_p) (void);
void (*to_async) (void (*) (enum inferior_event_type, void *), void *); void (*to_async) (void (*) (enum inferior_event_type, void *), void *);
int (*to_async_mask) (int); int (*to_async_mask) (int);
int (*to_supports_non_stop) (void);
int (*to_find_memory_regions) (int (*) (CORE_ADDR, int (*to_find_memory_regions) (int (*) (CORE_ADDR,
unsigned long, unsigned long,
int, int, int, int, int, int,
@ -966,6 +967,8 @@ extern int target_async_permitted;
/* Is the target in asynchronous execution mode? */ /* Is the target in asynchronous execution mode? */
#define target_is_async_p() (current_target.to_is_async_p ()) #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. */ /* Put the target in async mode with the specified callback function. */
#define target_async(CALLBACK,CONTEXT) \ #define target_async(CALLBACK,CONTEXT) \
(current_target.to_async ((CALLBACK), (CONTEXT))) (current_target.to_async ((CALLBACK), (CONTEXT)))