From: Pedro Alves <palves@redhat.com>
To: Tom Tromey <tom@tromey.com>, gdb-patches@sourceware.org
Subject: Re: [PATCH v3 5/8] Introduce run_on_main_thread
Date: Thu, 30 May 2019 13:12:00 -0000 [thread overview]
Message-ID: <9f9ea56d-349f-dc19-6201-9241fee71e49@redhat.com> (raw)
In-Reply-To: <20190529212916.23721-6-tom@tromey.com>
On 5/29/19 10:29 PM, Tom Tromey wrote:
> This introduces a way for a callback to be run on the main thread.
Can Python's gdb.post_event be built on top of this?
It would fix that nasty "atomically enough" race in gdbpy_run_events,
I guess.
>
> gdb/ChangeLog
> 2019-05-29 Tom Tromey <tom@tromey.com>
>
> * ser-event.h (run_on_main_thread): Declare.
> * ser-event.c (runnable_event, runnables, runnable_mutex): New
> globals.
> (run_events, run_on_main_thread, _initialize_ser_event): New
> functions.
> ---
> gdb/ChangeLog | 8 ++++++
> gdb/ser-event.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++
> gdb/ser-event.h | 6 +++++
> 3 files changed, 83 insertions(+)
>
> diff --git a/gdb/ser-event.c b/gdb/ser-event.c
> index d3956346246..4870433b287 100644
> --- a/gdb/ser-event.c
> +++ b/gdb/ser-event.c
> @@ -20,6 +20,10 @@
> #include "ser-event.h"
> #include "serial.h"
> #include "common/filestuff.h"
> +#if CXX_STD_THREAD
> +#include <mutex>
> +#endif
> +#include "event-loop.h"
>
> /* On POSIX hosts, a serial_event is basically an abstraction for the
> classical self-pipe trick.
> @@ -217,3 +221,68 @@ serial_event_clear (struct serial_event *event)
> ResetEvent (state->event);
> #endif
> }
> +
> +\f
> +
> +/* 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. */
> + std::swap (local, runnables);
> + }
> +
> + for (auto &item : local)
> + item ();
I'd think this should swallow errors when calling
each item, instead of letting an exception escape and
discard all other items, since each item call should be
in principle logically unrelated?
Maybe we could unit test this code.
Thanks,
Pedro Alves
next prev parent reply other threads:[~2019-05-30 13:12 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-29 21:29 [PATCH v3 0/8] Demangle minimal symbol names in worker threads Tom Tromey
2019-05-29 21:29 ` [PATCH v3 7/8] Demangle minsyms in parallel Tom Tromey
2019-05-30 14:19 ` Pedro Alves
2019-05-30 22:22 ` Tom Tromey
2019-05-29 21:29 ` [PATCH v3 1/8] Defer minimal symbol name-setting Tom Tromey
2019-05-29 21:29 ` [PATCH v3 3/8] Add configure check for std::thread Tom Tromey
2019-05-30 11:34 ` Pedro Alves
2019-05-29 21:29 ` [PATCH v3 4/8] Lock the demangled hash table Tom Tromey
2019-05-30 12:58 ` Pedro Alves
2019-05-30 14:03 ` Pedro Alves
2019-05-30 21:58 ` Tom Tromey
2019-05-29 21:29 ` [PATCH v3 2/8] Remove static buffer from ada_decode Tom Tromey
2019-05-30 0:08 ` Pedro Alves
2019-05-29 21:29 ` [PATCH v3 8/8] Add maint set/show max-worker-threads Tom Tromey
2019-05-30 2:36 ` Eli Zaretskii
2019-05-30 14:20 ` Pedro Alves
2019-05-29 21:29 ` [PATCH v3 5/8] Introduce run_on_main_thread Tom Tromey
2019-05-30 13:12 ` Pedro Alves [this message]
2019-05-30 13:20 ` Tom Tromey
2019-05-30 13:57 ` Pedro Alves
2019-05-30 14:01 ` Pedro Alves
2019-05-29 22:03 ` [PATCH v3 6/8] Introduce thread-safe way to handle SIGSEGV Tom Tromey
2019-05-30 13:40 ` Pedro Alves
2019-06-09 15:43 ` Tom Tromey
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=9f9ea56d-349f-dc19-6201-9241fee71e49@redhat.com \
--to=palves@redhat.com \
--cc=gdb-patches@sourceware.org \
--cc=tom@tromey.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox