summaryrefslogtreecommitdiff
path: root/gdb-rhbz2250652-avoid-PyOS_ReadlineTState.patch
diff options
context:
space:
mode:
Diffstat (limited to 'gdb-rhbz2250652-avoid-PyOS_ReadlineTState.patch')
-rw-r--r--gdb-rhbz2250652-avoid-PyOS_ReadlineTState.patch48
1 files changed, 48 insertions, 0 deletions
diff --git a/gdb-rhbz2250652-avoid-PyOS_ReadlineTState.patch b/gdb-rhbz2250652-avoid-PyOS_ReadlineTState.patch
new file mode 100644
index 0000000..1997ef9
--- /dev/null
+++ b/gdb-rhbz2250652-avoid-PyOS_ReadlineTState.patch
@@ -0,0 +1,48 @@
+From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Alexandra=20H=C3=A1jkov=C3=A1?= <ahajkova@redhat.com>
+Date: Mon, 8 Jan 2024 13:24:05 +0100
+Subject: gdb-rhbz2250652-avoid-PyOS_ReadlineTState.patch
+
+gdb/python: avoid use of _PyOS_ReadlineTState
+
+In python/py-gdb-readline.c we make use of _PyOS_ReadlineTState,
+however, this variable is no longer public in Python 3.13, and so GDB
+no longer builds.
+
+We are making use of _PyOS_ReadlineTState in order to re-acquire the
+Python Global Interpreter Lock (GIL). The _PyOS_ReadlineTState
+variable is set in Python's outer readline code prior to calling the
+user (GDB) supplied readline callback function, which for us is
+gdbpy_readline_wrapper. The gdbpy_readline_wrapper function is called
+without the GIL held.
+
+Instead of using _PyOS_ReadlineTState, I propose that we switch to
+calling PyGILState_Ensure() and PyGILState_Release(). These functions
+will acquire the GIL based on the current thread. I think this should
+be sufficient; I can't imagine why we'd be running
+gdbpy_readline_wrapper on one thread on behalf of a different Python
+thread.... that would be unexpected I think.
+
+Approved-By: Tom Tromey <tom@tromey.com>
+
+diff --git a/gdb/python/py-gdb-readline.c b/gdb/python/py-gdb-readline.c
+--- a/gdb/python/py-gdb-readline.c
++++ b/gdb/python/py-gdb-readline.c
+@@ -56,13 +56,11 @@ gdbpy_readline_wrapper (FILE *sys_stdin, FILE *sys_stdout,
+ if (except.reason == RETURN_QUIT)
+ return NULL;
+
+- /* The thread state is nulled during gdbpy_readline_wrapper,
+- with the original value saved in the following undocumented
+- variable (see Python's Parser/myreadline.c and
+- Modules/readline.c). */
+- PyEval_RestoreThread (_PyOS_ReadlineTState);
++
++ /* This readline callback is called without the GIL held. */
++ gdbpy_gil gil;
++
+ gdbpy_convert_exception (except);
+- PyEval_SaveThread ();
+ return NULL;
+ }
+