Python QUIT processing updates
authorKevin Buettner <kevinb@redhat.com>
Mon, 27 Feb 2023 23:11:37 +0000 (16:11 -0700)
committerKevin Buettner <kevinb@redhat.com>
Mon, 27 Feb 2023 23:20:39 +0000 (16:20 -0700)
See the previous patches in this series for the motivation behind
these changes.

This commit contains updates to Python's QUIT handling.  Ideally, we'd
like to throw gdb_exception_forced_quit through the extension
language; I made an attempt to do this for gdb_exception_quit in an
earlier version of this patch, but Pedro pointed out that it is
(almost certainly) not safe to do so.

Still, we definitely don't want to swallow the exception representing
a SIGTERM for GDB, nor do we want to force modules written in the
extension language to have to explicitly handle this case.  Since the
idea is for GDB to cleanup and quit for this exception, we'll simply
call quit_force() just as if the gdb_exception_forced_quit propagation
had managed to make it back to the top level.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=26761
Tested-by: Tom de Vries <tdevries@suse.de>
Approved-By: Pedro Alves <pedro@palves.net>
gdb/python/py-finishbreakpoint.c
gdb/python/py-gdb-readline.c
gdb/python/py-symbol.c
gdb/python/py-utils.c
gdb/python/py-value.c

index 3b682f5ad36f44c4b8a90b4651fb50759625e737..159164e80093ccde5b346727d1900c6874c6fafa 100644 (file)
@@ -20,6 +20,7 @@
 
 
 #include "defs.h"
+#include "top.h"               /* For quit_force().  */
 #include "python-internal.h"
 #include "breakpoint.h"
 #include "frame.h"
@@ -275,6 +276,10 @@ bpfinishpy_init (PyObject *self, PyObject *args, PyObject *kwargs)
            }
        }
     }
+  catch (const gdb_exception_forced_quit &except)
+    {
+      quit_force (NULL, 0);
+    }
   catch (const gdb_exception &except)
     {
       /* Just swallow.  Either the return type or the function value
index ea0f78c9ad8ecf6a2e8ddc395970bbf3451be9a7..b9294ad9afc47de683f123dff648b6b3b26c767e 100644 (file)
@@ -46,6 +46,10 @@ gdbpy_readline_wrapper (FILE *sys_stdin, FILE *sys_stdout,
       p = command_line_input (buffer, prompt, "python");
     }
   /* Handle errors by raising Python exceptions.  */
+  catch (const gdb_exception_forced_quit &e)
+    {
+      quit_force (NULL, 0);
+    }
   catch (const gdb_exception &except)
     {
       /* Detect user interrupt (Ctrl-C).  */
index e6497ed473fc276e56e0d18ae4e7f5c397323abd..066a27f0e35c0ebc9dc2da5ab6671e4a9af1692e 100644 (file)
@@ -18,6 +18,7 @@
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
+#include "top.h"               /* For force_quit ().  */
 #include "block.h"
 #include "frame.h"
 #include "symtab.h"
@@ -517,6 +518,10 @@ gdbpy_lookup_static_symbol (PyObject *self, PyObject *args, PyObject *kw)
        = get_selected_frame (_("No frame selected."));
       block = get_frame_block (selected_frame, NULL);
     }
+  catch (const gdb_exception_forced_quit &e)
+    {
+      quit_force (NULL, 0);
+    }
   catch (const gdb_exception &except)
     {
       /* Nothing.  */
index 624b90a827f96e040d92df16efd3e3f82ba5497b..d5b07a80d8258197040c28c8aba866a938074f74 100644 (file)
@@ -18,6 +18,7 @@
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
+#include "top.h"               /* For quit_force ().  */
 #include "charset.h"
 #include "value.h"
 #include "python-internal.h"
@@ -219,6 +220,8 @@ gdbpy_convert_exception (const struct gdb_exception &exception)
 
   if (exception.reason == RETURN_QUIT)
     exc_class = PyExc_KeyboardInterrupt;
+  else if (exception.reason == RETURN_FORCED_QUIT)
+    quit_force (NULL, 0);
   else if (exception.error == MEMORY_ERROR)
     exc_class = gdbpy_gdb_memory_error;
   else
index 9441a43cad8f2d3147156a3254cdce9f6a87bdec..65384c781bc20a54b91a416381a7a36edee422b5 100644 (file)
@@ -18,6 +18,7 @@
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
+#include "top.h"               /* For quit_force ().  */
 #include "charset.h"
 #include "value.h"
 #include "language.h"
@@ -371,6 +372,10 @@ valpy_get_address (PyObject *self, void *closure)
          res_val = value_addr (val_obj->value);
          val_obj->address = value_to_value_object (res_val);
        }
+      catch (const gdb_exception_forced_quit &except)
+       {
+         quit_force (NULL, 0);
+       }
       catch (const gdb_exception &except)
        {
          val_obj->address = Py_None;