Skip to content
Snippets Groups Projects
Commit b940a061 authored by Kevin Buettner's avatar Kevin Buettner
Browse files

Python QUIT processing updates

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: default avatarTom de Vries <tdevries@suse.de>
Approved-By: default avatarPedro Alves <pedro@palves.net>
parent b1ffd112
No related branches found
No related tags found
No related merge requests found
......@@ -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
......
......@@ -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). */
......
......@@ -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. */
......
......@@ -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
......
......@@ -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;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment