aboutsummaryrefslogtreecommitdiff
path: root/gdb/tid-parse.c
diff options
context:
space:
mode:
authorPedro Alves <palves@redhat.com>2016-01-15 21:46:23 +0000
committerPedro Alves <palves@redhat.com>2016-01-15 21:46:23 +0000
commit71ef29a86b252a4780517fc9b2bf9f7d3dd2d991 (patch)
tree6906fc0e6297b079fa951857e19f15aefd7143cc /gdb/tid-parse.c
parent3f5b7598805c8253c43c989a540a2408c8b685ad (diff)
downloadgdb-71ef29a86b252a4780517fc9b2bf9f7d3dd2d991.zip
gdb-71ef29a86b252a4780517fc9b2bf9f7d3dd2d991.tar.gz
gdb-71ef29a86b252a4780517fc9b2bf9f7d3dd2d991.tar.bz2
Star wildcard ranges (e.g., "info thread 2.*")
Add support for specifying "all threads of inferior N", by writing "*" as thread number/range in thread ID lists. E.g., "info threads 2.*" or "thread apply 2.* bt". gdb/ChangeLog: 2016-01-15 Pedro Alves <palves@redhat.com> * NEWS: Mention star wildcard ranges. * cli/cli-utils.c (get_number_or_range): Check state->in_range first. (number_range_setup_range): New function. * cli/cli-utils.h (number_range_setup_range): New declaration. * thread.c (thread_apply_command): Support star TID ranges. * tid-parse.c (tid_range_parser_finished) (tid_range_parser_string, tid_range_parser_skip) (get_tid_or_range, get_tid_or_range): Handle TID_RANGE_STATE_STAR_RANGE. (tid_range_parser_star_range): New function. * tid-parse.h (enum tid_range_state) <TID_RANGE_STATE_STAR_RANGE>: New value. (tid_range_parser_star_range): New declaration. gdb/doc/ChangeLog: 2016-01-15 Pedro Alves <palves@redhat.com> * gdb.texinfo (Threads) <thread ID lists>: Document star ranges. gdb/testsuite/ChangeLog: 2016-01-15 Pedro Alves <palves@redhat.com> * gdb.multi/tids.exp: Test star wildcard ranges.
Diffstat (limited to 'gdb/tid-parse.c')
-rw-r--r--gdb/tid-parse.c28
1 files changed, 25 insertions, 3 deletions
diff --git a/gdb/tid-parse.c b/gdb/tid-parse.c
index 45b7ff5..68133c6 100644
--- a/gdb/tid-parse.c
+++ b/gdb/tid-parse.c
@@ -134,6 +134,7 @@ tid_range_parser_finished (struct tid_range_parser *parser)
case TID_RANGE_STATE_INFERIOR:
return *parser->string == '\0';
case TID_RANGE_STATE_THREAD_RANGE:
+ case TID_RANGE_STATE_STAR_RANGE:
return parser->range_parser.finished;
}
@@ -150,6 +151,7 @@ tid_range_parser_string (struct tid_range_parser *parser)
case TID_RANGE_STATE_INFERIOR:
return parser->string;
case TID_RANGE_STATE_THREAD_RANGE:
+ case TID_RANGE_STATE_STAR_RANGE:
return parser->range_parser.string;
}
@@ -161,7 +163,8 @@ tid_range_parser_string (struct tid_range_parser *parser)
void
tid_range_parser_skip (struct tid_range_parser *parser)
{
- gdb_assert ((parser->state == TID_RANGE_STATE_THREAD_RANGE)
+ gdb_assert ((parser->state == TID_RANGE_STATE_THREAD_RANGE
+ || parser->state == TID_RANGE_STATE_STAR_RANGE)
&& parser->range_parser.in_range);
tid_range_parser_init (parser, parser->range_parser.end_ptr,
@@ -219,7 +222,16 @@ get_tid_or_range (struct tid_range_parser *parser, int *inf_num,
}
init_number_or_range (&parser->range_parser, p);
- parser->state = TID_RANGE_STATE_THREAD_RANGE;
+ if (p[0] == '*' && (p[1] == '\0' || isspace (p[1])))
+ {
+ /* Setup the number range parser to return numbers in the
+ whole [1,INT_MAX] range. */
+ number_range_setup_range (&parser->range_parser, 1, INT_MAX,
+ skip_spaces_const (p + 1));
+ parser->state = TID_RANGE_STATE_STAR_RANGE;
+ }
+ else
+ parser->state = TID_RANGE_STATE_THREAD_RANGE;
}
*inf_num = parser->inf_num;
@@ -247,7 +259,9 @@ get_tid_or_range (struct tid_range_parser *parser, int *inf_num,
/* If we're midway through a range, and the caller wants the end
value, return it and skip to the end of the range. */
- if (thr_end != NULL && parser->state == TID_RANGE_STATE_THREAD_RANGE)
+ if (thr_end != NULL
+ && (parser->state == TID_RANGE_STATE_THREAD_RANGE
+ || parser->state == TID_RANGE_STATE_STAR_RANGE))
{
*thr_end = parser->range_parser.end_value;
tid_range_parser_skip (parser);
@@ -281,6 +295,14 @@ tid_range_parser_get_tid (struct tid_range_parser *parser,
/* See tid-parse.h. */
int
+tid_range_parser_star_range (struct tid_range_parser *parser)
+{
+ return parser->state == TID_RANGE_STATE_STAR_RANGE;
+}
+
+/* See gdbthread.h. */
+
+int
tid_is_in_list (const char *list, int default_inferior,
int inf_num, int thr_num)
{