[gdb] Initialize main_thread_id earlier

I wrote a patch using is_main_thread (), and found it returning false in the
main thread due to main_thread_id not being initialized yet.

Initialization currently takes place in _initialize_run_on_main_thread, but
that's too late for earlier uses.

Fix this by initializing, either:
- when entering main, or
- on an earlier first use.

Tested on x86_64-linux.

Approved-By: Tom Tromey <tom@tromey.com>
This commit is contained in:
Tom de Vries 2023-08-02 23:17:35 +02:00
parent 3c3e54d7b5
commit c082d7f58e
2 changed files with 25 additions and 1 deletions

View file

@ -19,10 +19,17 @@
#include "defs.h"
#include "main.h"
#include "interps.h"
#include "run-on-main-thread.h"
int
main (int argc, char **argv)
{
/* The first call to is_main_thread () should be from the main thread.
If this is the first call, then that requirement is fulfilled here.
If this is not the first call, then this verifies that the first call
fulfilled that requirement. */
gdb_assert (is_main_thread ());
struct captured_main_args args;
memset (&args, 0, sizeof args);

View file

@ -94,12 +94,24 @@ run_on_main_thread (std::function<void ()> &&func)
serial_event_set (runnable_event);
}
#if CXX_STD_THREAD
static bool main_thread_id_initialized = false;
#endif
/* See run-on-main-thread.h. */
bool
is_main_thread ()
{
#if CXX_STD_THREAD
/* Initialize main_thread_id on first use of is_main_thread. */
if (!main_thread_id_initialized)
{
main_thread_id_initialized = true;
main_thread_id = std::this_thread::get_id ();
}
return std::this_thread::get_id () == main_thread_id;
#else
return true;
@ -111,7 +123,12 @@ void
_initialize_run_on_main_thread ()
{
#if CXX_STD_THREAD
main_thread_id = std::this_thread::get_id ();
/* The variable main_thread_id should be initialized when entering main, or
at an earlier use, so it should already be initialized here. */
gdb_assert (main_thread_id_initialized);
/* Assume that we execute this in the main thread. */
gdb_assert (is_main_thread ());
#endif
runnable_event = make_serial_event ();
add_file_handler (serial_event_fd (runnable_event), run_events, nullptr,