aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog13
-rw-r--r--gdb/infcmd.c6
-rw-r--r--gdb/linux-nat.c7
-rw-r--r--gdb/target.c24
-rw-r--r--gdb/target.h3
5 files changed, 53 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 7b3564e..35bd2ac 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -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>
Vladimir Prus <vladimir@codesourcery.com>
diff --git a/gdb/infcmd.c b/gdb/infcmd.c
index 82d4710..02ec980 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 b25104e..126f7dc 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 e469905..1f65819 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 = &current_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 350a7c4..067c031 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)))