gdb: create new is_thread_id helper function

This is a refactoring commit that splits the existing parse_thread_id
function into two parts, and then adds a new is_thread_id function.

The core of parse_thread_id is split into parse_thread_id_1, which is
responsible for actually parsing a thread-id.  Then parse_thread_id is
responsible for taking a parsed thread-id and validating that it
references an actually existing inferior thread.

The new is_thread_id function also uses parse_thread_id_1, but doesn't
actually check that the inferior thread exists, instead, this new
function simply checks that a string looks like a thread-id.

This commit does not add a use for is_thread_id, this will be added in
the next commit.

This is a refactoring commit, there should be no user visible changes
after this commit.
This commit is contained in:
Andrew Burgess 2023-12-28 22:59:43 +00:00
parent 3debc0b348
commit 5a7cfbb424
2 changed files with 70 additions and 20 deletions

View File

@ -47,40 +47,43 @@ get_positive_number_trailer (const char **pp, int trailer, const char *string)
return num;
}
/* See tid-parse.h. */
/* Parse TIDSTR as a per-inferior thread ID, in either INF_NUM.THR_NUM
or THR_NUM form, and return a pair, the first item of the pair is
INF_NUM and the second item is THR_NUM.
struct thread_info *
parse_thread_id (const char *tidstr, const char **end)
If TIDSTR does not include an INF_NUM component, then the first item in
the pair will be 0 (which is an invalid inferior number), this indicates
that TIDSTR references the current inferior.
This function does not validate the INF_NUM and THR_NUM are actually
valid numbers, that is, they might reference inferiors or threads that
don't actually exist; this function just splits the string into its
component parts.
If there is an error parsing TIDSTR then this function will raise an
exception. */
static std::pair<int, int>
parse_thread_id_1 (const char *tidstr, const char **end)
{
const char *number = tidstr;
const char *dot, *p1;
struct inferior *inf;
int thr_num;
int explicit_inf_id = 0;
int thr_num, inf_num;
dot = strchr (number, '.');
if (dot != NULL)
{
/* Parse number to the left of the dot. */
int inf_num;
p1 = number;
inf_num = get_positive_number_trailer (&p1, '.', number);
if (inf_num == 0)
invalid_thread_id_error (number);
inf = find_inferior_id (inf_num);
if (inf == NULL)
error (_("No inferior number '%d'"), inf_num);
explicit_inf_id = 1;
p1 = dot + 1;
}
else
{
inf = current_inferior ();
inf_num = 0;
p1 = number;
}
@ -88,6 +91,32 @@ parse_thread_id (const char *tidstr, const char **end)
if (thr_num == 0)
invalid_thread_id_error (number);
if (end != nullptr)
*end = p1;
return { inf_num, thr_num };
}
/* See tid-parse.h. */
struct thread_info *
parse_thread_id (const char *tidstr, const char **end)
{
const auto [inf_num, thr_num] = parse_thread_id_1 (tidstr, end);
inferior *inf;
bool explicit_inf_id = false;
if (inf_num != 0)
{
inf = find_inferior_id (inf_num);
if (inf == nullptr)
error (_("No inferior number '%d'"), inf_num);
explicit_inf_id = true;
}
else
inf = current_inferior ();
thread_info *tp = nullptr;
for (thread_info *it : inf->threads ())
if (it->per_inf_num == thr_num)
@ -96,7 +125,7 @@ parse_thread_id (const char *tidstr, const char **end)
break;
}
if (tp == NULL)
if (tp == nullptr)
{
if (show_inferior_qualified_tids () || explicit_inf_id)
error (_("Unknown thread %d.%d."), inf->num, thr_num);
@ -104,14 +133,27 @@ parse_thread_id (const char *tidstr, const char **end)
error (_("Unknown thread %d."), thr_num);
}
if (end != NULL)
*end = p1;
return tp;
}
/* See tid-parse.h. */
bool
is_thread_id (const char *tidstr, const char **end)
{
try
{
(void) parse_thread_id_1 (tidstr, end);
return true;
}
catch (const gdb_exception_error &)
{
return false;
}
}
/* See tid-parse.h. */
tid_range_parser::tid_range_parser (const char *tidlist,
int default_inferior)
{

View File

@ -36,6 +36,14 @@ struct thread_info;
thrown. */
struct thread_info *parse_thread_id (const char *tidstr, const char **end);
/* Return true if TIDSTR is pointing to a string that looks like a
thread-id. This doesn't mean that TIDSTR identifies a valid thread, but
the string does at least look like a valid thread-id. If END is not
NULL, parse_thread_id stores the address of the first character after
the thread-id into *END. */
bool is_thread_id (const char *tidstr, const char **end);
/* Parse a thread ID or a thread range list.
A range will be of the form