#include "symtab.h"
#include "frame.h"
#include "inferior.h"
-#include "common/environ.h"
+#include "gdbsupport/environ.h"
#include "value.h"
#include "target.h"
#include "gdbthread.h"
#include "thread-fsm.h"
#include "tid-parse.h"
#include <algorithm>
-#include "common/gdb_optional.h"
+#include "gdbsupport/gdb_optional.h"
#include "inline-frame.h"
#include "stack.h"
step_over_chain_remove (&step_over_queue_head, tp);
}
-/* Delete the thread referenced by THR. If SILENT, don't notifyi
+/* Delete the thread referenced by THR. If SILENT, don't notify
the observer of this exit.
THR must not be NULL or a failed assertion will be raised. */
delete_thread (tp);
}
-/* Return true value if stack temporaies are enabled for the thread
+/* Return true value if stack temporaries are enabled for the thread
TP. */
bool
}
if (show_global_ids || uiout->is_mi_like_p ())
- uiout->field_int ("id", tp->global_num);
+ uiout->field_signed ("id", tp->global_num);
/* For the CLI, we stuff everything into the target-id field.
This is a gross hack to make the output come out looking
core = target_core_of_thread (tp->ptid);
if (uiout->is_mi_like_p () && core != -1)
- uiout->field_int ("core", core);
+ uiout->field_signed ("core", core);
}
/* This end scope restores the current thread and the frame
if (pid == -1 && requested_threads == NULL)
{
if (uiout->is_mi_like_p () && inferior_ptid != null_ptid)
- uiout->field_int ("current-thread-id", current_thread->global_num);
+ uiout->field_signed ("current-thread-id", current_thread->global_num);
if (inferior_ptid != null_ptid && current_exited)
uiout->message ("\n\
print_thread_info_1 (uiout, requested_threads, 1, pid, 0);
}
+/* The options for the "info threads" command. */
+
+struct info_threads_opts
+{
+ /* For "-gid". */
+ bool show_global_ids = false;
+};
+
+static const gdb::option::option_def info_threads_option_defs[] = {
+
+ gdb::option::flag_option_def<info_threads_opts> {
+ "gid",
+ [] (info_threads_opts *opts) { return &opts->show_global_ids; },
+ N_("Show global thread IDs."),
+ },
+
+};
+
+/* Create an option_def_group for the "info threads" options, with
+ IT_OPTS as context. */
+
+static inline gdb::option::option_def_group
+make_info_threads_options_def_group (info_threads_opts *it_opts)
+{
+ return {{info_threads_option_defs}, it_opts};
+}
+
/* Implementation of the "info threads" command.
Note: this has the drawback that it _really_ switches
static void
info_threads_command (const char *arg, int from_tty)
{
- int show_global_ids = 0;
+ info_threads_opts it_opts;
+
+ auto grp = make_info_threads_options_def_group (&it_opts);
+ gdb::option::process_options
+ (&arg, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_ERROR, grp);
- if (arg != NULL
- && check_for_argument (&arg, "-gid", sizeof ("-gid") - 1))
+ print_thread_info_1 (current_uiout, arg, 0, -1, it_opts.show_global_ids);
+}
+
+/* Completer for the "info threads" command. */
+
+static void
+info_threads_command_completer (struct cmd_list_element *ignore,
+ completion_tracker &tracker,
+ const char *text, const char *word_ignored)
+{
+ const auto grp = make_info_threads_options_def_group (nullptr);
+
+ if (gdb::option::complete_options
+ (tracker, &text, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_ERROR, grp))
+ return;
+
+ /* Convenience to let the user know what the option can accept. */
+ if (*text == '\0')
{
- arg = skip_spaces (arg);
- show_global_ids = 1;
+ gdb::option::complete_on_all_options (tracker, grp);
+ /* Keep this "ID" in sync with what "help info threads"
+ says. */
+ tracker.add_completion (make_unique_xstrdup ("ID"));
}
-
- print_thread_info_1 (current_uiout, arg, 0, -1, show_global_ids);
}
/* See gdbthread.h. */
reinit_frame_cache ();
}
-/* See common/common-gdbthread.h. */
+/* See gdbsupport/common-gdbthread.h. */
void
switch_to_thread (ptid_t ptid)
ASCENDING and FLAGS as context. */
static inline std::array<gdb::option::option_def_group, 2>
-make_thread_apply_all_options_def_group (int *ascending,
+make_thread_apply_all_options_def_group (bool *ascending,
qcs_flags *flags)
{
return {{
static void
thread_apply_all_command (const char *cmd, int from_tty)
{
- int ascending = false;
+ bool ascending = false;
qcs_flags flags;
auto group = make_thread_apply_all_options_def_group (&ascending,
static void
taas_command (const char *cmd, int from_tty)
{
+ if (cmd == NULL || *cmd == '\0')
+ error (_("Please specify a command to apply on all threads"));
std::string expanded = std::string ("thread apply all -s ") + cmd;
execute_command (expanded.c_str (), from_tty);
}
static void
tfaas_command (const char *cmd, int from_tty)
{
+ if (cmd == NULL || *cmd == '\0')
+ error (_("Please specify a command to apply on all frames of all threads"));
std::string expanded
= std::string ("thread apply all -s -- frame apply all -s ") + cmd;
execute_command (expanded.c_str (), from_tty);
}
/* Print notices when new threads are attached and detached. */
-int print_thread_events = 1;
+bool print_thread_events = true;
static void
show_print_thread_events (struct ui_file *file, int from_tty,
struct cmd_list_element *c, const char *value)
{
if (uiout->is_mi_like_p ())
{
- uiout->field_int ("new-thread-id",
- inferior_thread ()->global_num);
+ uiout->field_signed ("new-thread-id",
+ inferior_thread ()->global_num);
}
else
{
static struct cmd_list_element *thread_apply_list = NULL;
cmd_list_element *c;
- add_info ("threads", info_threads_command,
- _("Display currently known threads.\n\
-Usage: info threads [-gid] [ID]...\n\
--gid: Show global thread IDs.\n\
+ const auto info_threads_opts = make_info_threads_options_def_group (nullptr);
+
+ /* Note: keep this "ID" in sync with what "info threads [TAB]"
+ suggests. */
+ static std::string info_threads_help
+ = gdb::option::build_help (_("\
+Display currently known threads.\n\
+Usage: info threads [OPTION]... [ID]...\n\
+\n\
+Options:\n\
+%OPTIONS%\
If ID is given, it is a space-separated list of IDs of threads to display.\n\
-Otherwise, all threads are displayed."));
+Otherwise, all threads are displayed."),
+ info_threads_opts);
+
+ c = add_info ("threads", info_threads_command, info_threads_help.c_str ());
+ set_cmd_completer_handle_brkchars (c, info_threads_command_completer);
add_prefix_cmd ("thread", class_run, thread_command, _("\
Use this command to switch between threads.\n\
const auto thread_apply_opts = make_thread_apply_options_def_group (nullptr);
- static std::string thread_apply_help = gdb::option::build_help (N_("\
+ static std::string thread_apply_help = gdb::option::build_help (_("\
Apply a command to a list of threads.\n\
Usage: thread apply ID... [OPTION]... COMMAND\n\
ID is a space-separated list of IDs of threads to apply COMMAND on.\n"
const auto thread_apply_all_opts
= make_thread_apply_all_options_def_group (nullptr, nullptr);
- static std::string thread_apply_all_help = gdb::option::build_help (N_("\
+ static std::string thread_apply_all_help = gdb::option::build_help (_("\
Apply a command to all threads.\n\
\n\
Usage: thread apply all [OPTION]... COMMAND\n"