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:
parent
c6ebd6cf99
commit
9908b56683
5 changed files with 53 additions and 0 deletions
|
@ -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>
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
24
gdb/target.c
24
gdb/target.c
|
@ -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 = ¤t_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;
|
||||||
|
|
|
@ -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)))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue