From: Tom de Vries <tdevries@suse.de>
To: Tom Tromey <tromey@adacore.com>, gdb-patches@sourceware.org
Subject: Re: [PATCH] Fix gdb.interrupt race
Date: Tue, 27 Feb 2024 16:07:45 +0100 [thread overview]
Message-ID: <d59595d9-8993-4119-9725-8e4751d35188@suse.de> (raw)
In-Reply-To: <20240223162031.3568167-1-tromey@adacore.com>
On 2/23/24 17:20, Tom Tromey wrote:
> gdb.interrupt was introduced to implement DAP request cancellation.
> However, because it can be run from another thread, and because I
> didn't look deeply enough at the implementation, it turns out to be
> racy.
>
> The fix here is to lock accesses to certain globals in extension.c.
>
I've tested this on x86_64-linux, and see the failing runs go from 2/10
to 0/10.
> Note that this won't work in the case where configure detects that the
> C++ compiler doesn't provide thread support. In this patch I chose to
> simply let this race, but another choice would be to disable DAP
> entirely in this situation.
>
I vote disable. If somebody has such a platform and wants DAP, they can
submit a patch that enables it for them in a way that is safe.
Anyway, since the patch documents the choice explicitly, this LGTM as is.
Approved-By: Tom de Vries <tdevries@suse.de>
Tested-By: Tom de Vries <tdevries@suse.de>
Thanks,
- Tom
> Regression tested on x86-64 Fedora 38. I also ran gdb.dap/pause.exp
> in a thread-sanitizer build tree to make sure the reported race is
> gone.
>
> Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31263
> ---
> gdb/extension.c | 39 +++++++++++++++++++++++++++++++++++++++
> 1 file changed, 39 insertions(+)
>
> diff --git a/gdb/extension.c b/gdb/extension.c
> index 42e05199d2c..3a77d355a78 100644
> --- a/gdb/extension.c
> +++ b/gdb/extension.c
> @@ -634,6 +634,21 @@ breakpoint_ext_lang_cond_says_stop (struct breakpoint *b)
> This requires cooperation with the extension languages so the support
> is defined here. */
>
> +#if CXX_STD_THREAD
> +
> +#include <mutex>
> +
> +/* DAP needs a way to interrupt the main thread, so we added
> + gdb.interrupt. However, as this can run from any thread, we need
> + locking for the current extension language. If threading is not
> + available, we simply let this race.
> +
> + This lock is held for accesses to quit_flag, active_ext_lang, and
> + cooperative_sigint_handling_disabled. */
> +static std::recursive_mutex ext_lang_mutex;
> +
> +#endif /* CXX_STD_THREAD */
> +
> /* This flag tracks quit requests when we haven't called out to an
> extension language. it also holds quit requests when we transition to
> an extension language that doesn't have cooperative SIGINT handling. */
> @@ -689,6 +704,10 @@ static bool cooperative_sigint_handling_disabled = false;
>
> scoped_disable_cooperative_sigint_handling::scoped_disable_cooperative_sigint_handling ()
> {
> +#if CXX_STD_THREAD
> + std::lock_guard guard (ext_lang_mutex);
> +#endif /* CXX_STD_THREAD */
> +
> /* Force the active extension language to the GDB scripting
> language. This ensures that a previously saved SIGINT is moved
> to the quit_flag global, as well as ensures that future SIGINTs
> @@ -706,6 +725,10 @@ scoped_disable_cooperative_sigint_handling::scoped_disable_cooperative_sigint_ha
>
> scoped_disable_cooperative_sigint_handling::~scoped_disable_cooperative_sigint_handling ()
> {
> +#if CXX_STD_THREAD
> + std::lock_guard guard (ext_lang_mutex);
> +#endif /* CXX_STD_THREAD */
> +
> cooperative_sigint_handling_disabled = m_prev_cooperative_sigint_handling_disabled;
> restore_active_ext_lang (m_prev_active_ext_lang_state);
> }
> @@ -744,6 +767,10 @@ scoped_disable_cooperative_sigint_handling::~scoped_disable_cooperative_sigint_h
> struct active_ext_lang_state *
> set_active_ext_lang (const struct extension_language_defn *now_active)
> {
> +#if CXX_STD_THREAD
> + std::lock_guard guard (ext_lang_mutex);
> +#endif /* CXX_STD_THREAD */
> +
> #if GDB_SELF_TEST
> if (selftests::hook_set_active_ext_lang)
> selftests::hook_set_active_ext_lang ();
> @@ -796,6 +823,10 @@ set_active_ext_lang (const struct extension_language_defn *now_active)
> void
> restore_active_ext_lang (struct active_ext_lang_state *previous)
> {
> +#if CXX_STD_THREAD
> + std::lock_guard guard (ext_lang_mutex);
> +#endif /* CXX_STD_THREAD */
> +
> if (cooperative_sigint_handling_disabled)
> {
> /* See set_active_ext_lang. */
> @@ -832,6 +863,10 @@ restore_active_ext_lang (struct active_ext_lang_state *previous)
> void
> set_quit_flag (void)
> {
> +#if CXX_STD_THREAD
> + std::lock_guard guard (ext_lang_mutex);
> +#endif /* CXX_STD_THREAD */
> +
> if (active_ext_lang->ops != NULL
> && active_ext_lang->ops->set_quit_flag != NULL)
> active_ext_lang->ops->set_quit_flag (active_ext_lang);
> @@ -856,6 +891,10 @@ set_quit_flag (void)
> int
> check_quit_flag (void)
> {
> +#if CXX_STD_THREAD
> + std::lock_guard guard (ext_lang_mutex);
> +#endif /* CXX_STD_THREAD */
> +
> int result = 0;
>
> for (const struct extension_language_defn *extlang : extension_languages)
next prev parent reply other threads:[~2024-02-27 15:07 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-23 16:20 Tom Tromey
2024-02-27 15:07 ` Tom de Vries [this message]
2024-02-27 18:37 ` Tom Tromey
2024-02-28 3:23 ` Tom de Vries
2024-02-28 16:09 ` 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=d59595d9-8993-4119-9725-8e4751d35188@suse.de \
--to=tdevries@suse.de \
--cc=gdb-patches@sourceware.org \
--cc=tromey@adacore.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;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).