Release the GIL while running a gdb command or expression

PR python/23615 points out that gdb.execute_gdb_command does not
release the Python GIL.  This means that, while the gdb command is
running, other Python threads do not run.

This patch solves the problem by introducing a new RAII class that can
be used to temporarily release and then re-acquire the GIL, then puts
this into the appropriate places in execute_gdb_command and
gdbpy_parse_and_eval.

This does not include a test case, because after some research I could
not find a way to write one that was not racy.

gdb/ChangeLog
2019-01-30  Tom Tromey  <tom@tromey.com>

	PR python/23615:
	* python/python.c (execute_gdb_command): Use gdbpy_allow_threads.
	(gdbpy_parse_and_eval): Likewise.
	* python/python-internal.h (gdbpy_allow_threads): New class.
This commit is contained in:
Tom Tromey 2018-09-07 20:02:21 -06:00
parent eeb14ea976
commit b5eba2d8c0
3 changed files with 35 additions and 0 deletions

View file

@ -684,6 +684,31 @@ class gdbpy_enter_varobj : public gdbpy_enter
};
/* The opposite of gdb_enter: this releases the GIL around a region,
allowing other Python threads to run. No Python APIs may be used
while this is active. */
class gdbpy_allow_threads
{
public:
gdbpy_allow_threads ()
: m_save (PyEval_SaveThread ())
{
gdb_assert (m_save != nullptr);
}
~gdbpy_allow_threads ()
{
PyEval_RestoreThread (m_save);
}
DISABLE_COPY_AND_ASSIGN (gdbpy_allow_threads);
private:
PyThreadState *m_save;
};
extern struct gdbarch *python_gdbarch;
extern const struct language_defn *python_language;