PR python/15620, PR python/18620 - breakpoint events in Python

This patch adds some breakpoint events to Python.  In particular,
there is a creation event that is emitted when a breakpoint is
created; a modification event that is emitted when a breakpoint
changes somehow; and a deletion event that is emitted when a
breakpoint is deleted.

In this patch, the event's payload is the breakpoint itself.  I
considered making a new event type to hold the breakpoint, but I
didn't see a need.  Still, I thought I would mention this as a spot
where some other choice is possible.

Built and regtested on x86-64 Fedora 23.

2016-07-13  Tom Tromey  <tom@tromey.com>

	PR python/15620, PR python/18620:
	* python/py-evts.c (gdbpy_initialize_py_events): Call
	add_new_registry for new events.
	* python/py-events.h (events_object) <breakpoint_created,
	breakpoint_deleted, breakpoint_modified>: New fields.
	* python/py-breakpoint.c (gdbpy_breakpoint_created): Emit the
	breakpoint changed event.
	(gdbpy_breakpoint_deleted): Emit the breakpoint deleted event.
	(gdbpy_breakpoint_modified): New function.
	(gdbpy_initialize_breakpoints): Attach to the breakpoint modified
	observer.

2016-07-13  Tom Tromey  <tom@tromey.com>

	PR python/15620, PR python/18620:
	* python.texi (Events In Python): Document new breakpoint events.

2016-07-13  Tom Tromey  <tom@tromey.com>

	PR python/15620, PR python/18620:
	* gdb.python/py-breakpoint.exp (connect_event, check_last_event)
	(test_bkpt_events): New procs.
This commit is contained in:
Tom Tromey 2015-05-04 21:49:11 -06:00
parent 93daf339a4
commit dac790e1b9
8 changed files with 143 additions and 0 deletions

View file

@ -31,6 +31,7 @@
#include "arch-utils.h"
#include "language.h"
#include "location.h"
#include "py-event.h"
/* Number of live breakpoints. */
static int bppy_live;
@ -916,6 +917,14 @@ gdbpy_breakpoint_created (struct breakpoint *bp)
gdbpy_print_stack ();
}
if (!evregpy_no_listeners_p (gdb_py_events.breakpoint_created))
{
Py_INCREF (newbp);
if (evpy_emit_event ((PyObject *) newbp,
gdb_py_events.breakpoint_created) < 0)
gdbpy_print_stack ();
}
PyGILState_Release (state);
}
@ -936,6 +945,15 @@ gdbpy_breakpoint_deleted (struct breakpoint *b)
bp_obj = bp->py_bp_object;
if (bp_obj)
{
if (!evregpy_no_listeners_p (gdb_py_events.breakpoint_deleted))
{
PyObject *bp_obj_alias = (PyObject *) bp_obj;
Py_INCREF (bp_obj_alias);
if (evpy_emit_event (bp_obj_alias,
gdb_py_events.breakpoint_deleted) < 0)
gdbpy_print_stack ();
}
bp_obj->bp = NULL;
--bppy_live;
Py_DECREF (bp_obj);
@ -944,6 +962,35 @@ gdbpy_breakpoint_deleted (struct breakpoint *b)
PyGILState_Release (state);
}
/* Callback that is used when a breakpoint is modified. */
static void
gdbpy_breakpoint_modified (struct breakpoint *b)
{
int num = b->number;
PyGILState_STATE state;
struct breakpoint *bp = NULL;
gdbpy_breakpoint_object *bp_obj;
state = PyGILState_Ensure ();
bp = get_breakpoint (num);
if (bp)
{
PyObject *bp_obj = (PyObject *) bp->py_bp_object;
if (bp_obj)
{
if (!evregpy_no_listeners_p (gdb_py_events.breakpoint_modified))
{
Py_INCREF (bp_obj);
if (evpy_emit_event (bp_obj,
gdb_py_events.breakpoint_modified) < 0)
gdbpy_print_stack ();
}
}
}
PyGILState_Release (state);
}
/* Initialize the Python breakpoint code. */
@ -962,6 +1009,7 @@ gdbpy_initialize_breakpoints (void)
observer_attach_breakpoint_created (gdbpy_breakpoint_created);
observer_attach_breakpoint_deleted (gdbpy_breakpoint_deleted);
observer_attach_breakpoint_modified (gdbpy_breakpoint_modified);
/* Add breakpoint types constants. */
for (i = 0; pybp_codes[i].name; ++i)