binutils-gdb/gdb/run-on-main-thread.c
Simon Marchi 2554f6f564 gdb: give names to event loop file handlers
Assign names to event loop file handlers.  They will be used in debug
messages when file handlers are invoked.

In GDB, each UI used to get its own unique number, until commit
cbe256847e ("Remove ui::num").  Re-introduce this field, and use it to
make a unique name for the handler.

I'm not too sure what goes on in ser-base.c, all I know is that it's
what is used when debugging remotely.  I've just named the main handler
"serial".  It would be good to have unique names there too.  For instance
when debugging with two different remote connections, we'd ideally want
the handlers to have unique names.  I didn't do it in this patch though.

gdb/ChangeLog:

	* async-event.c (initialize_async_signal_handlers): Pass name to
	add_file_handler
	* event-top.c (ui_register_input_event_handler): Likewise.
	* linux-nat.c (linux_nat_target::async): Likewise.
	* run-on-main-thread.c (_initialize_run_on_main_thread):
	Likewise
	* ser-base.c (reschedule): Likewise.
	(ser_base_async): Likewise.
	* tui/tui-io.c: Likewise.
	* top.h (struct ui) <num>: New field.
	* top.c (highest_ui_num): New variable.
	(ui::ui): Initialize num.

gdbserver/ChangeLog:

	* linux-low.cc (linux_process_target::async): Pass name to
	add_file_handler.
	* remote-utils.cc (handle_accept_event): Likewise.
	(remote_open): Likewise.

gdbsupport/ChangeLog:

	* event-loop.h (add_file_handler): Add "name" parameter.
	* event-loop.cc (struct file_handler) <name>: New field.
	(create_file_handler): Add "name" parameter, assign it to file
	handler.
	(add_file_handler): Add "name" parameter.

Change-Id: I9f1545f73888ebb6778eb653a618ca44d105f92c
2020-10-02 14:46:56 -04:00

100 lines
2.5 KiB
C

/* Run a function on the main thread
Copyright (C) 2019-2020 Free Software Foundation, Inc.
This file is part of GDB.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "run-on-main-thread.h"
#include "ser-event.h"
#if CXX_STD_THREAD
#include <mutex>
#endif
#include "gdbsupport/event-loop.h"
/* The serial event used when posting runnables. */
static struct serial_event *runnable_event;
/* Runnables that have been posted. */
static std::vector<std::function<void ()>> runnables;
#if CXX_STD_THREAD
/* Mutex to hold when handling RUNNABLE_EVENT or RUNNABLES. */
static std::mutex runnable_mutex;
#endif
/* Run all the queued runnables. */
static void
run_events (int error, gdb_client_data client_data)
{
std::vector<std::function<void ()>> local;
/* Hold the lock while changing the globals, but not while running
the runnables. */
{
#if CXX_STD_THREAD
std::lock_guard<std::mutex> lock (runnable_mutex);
#endif
/* Clear the event fd. Do this before flushing the events list,
so that any new event post afterwards is sure to re-awaken the
event loop. */
serial_event_clear (runnable_event);
/* Move the vector in case running a runnable pushes a new
runnable. */
local = std::move (runnables);
}
for (auto &item : local)
{
try
{
item ();
}
catch (...)
{
/* Ignore exceptions in the callback. */
}
}
}
/* See run-on-main-thread.h. */
void
run_on_main_thread (std::function<void ()> &&func)
{
#if CXX_STD_THREAD
std::lock_guard<std::mutex> lock (runnable_mutex);
#endif
runnables.emplace_back (std::move (func));
serial_event_set (runnable_event);
}
void _initialize_run_on_main_thread ();
void
_initialize_run_on_main_thread ()
{
runnable_event = make_serial_event ();
add_file_handler (serial_event_fd (runnable_event), run_events, nullptr,
"run-on-main-thread");
}