Add new_inferior, inferior_deleted, and new_thread events
This adds a few new events to gdb's Python layer: new_inferior, inferior_deleted, and new_thread. I wanted to be able to add a combined inferior/thread display window to my GUI, and I needed a few events to make this work. This is PR python/15622. ChangeLog 2017-09-11 Tom Tromey <tom@tromey.com> PR python/15622: * NEWS: Add entry. * python/python.c (do_start_initialization): Initialize new event types. * python/python-internal.h (gdbpy_initialize_new_inferior_event) (gdbpy_initialize_inferior_deleted_event) (gdbpy_initialize_new_thread_event): Declare. * python/py-threadevent.c (create_thread_event_object): Add option "thread" parameter. * python/py-inferior.c (new_thread_event_object_type) (new_inferior_event_object_type) (inferior_deleted_event_object_type): Declare. (python_new_inferior, python_inferior_deleted): New functions. (add_thread_object): Emit new_thread event. (gdbpy_initialize_inferior): Attach new functions to corresponding observers. (new_thread, new_inferior, inferior_deleted): Define new event types. * python/py-evts.c (gdbpy_initialize_py_events): Add new registries. * python/py-events.h (events_object) <new_inferior, inferior_deleted, new_thread>: New fields. * python/py-event.h (create_thread_event_breakpoint): Add optional "thread" parameter. doc/ChangeLog 2017-09-11 Tom Tromey <tom@tromey.com> * python.texi (Events In Python): Document new events. testsuite/ChangeLog 2017-09-11 Tom Tromey <tom@tromey.com> * gdb.python/py-infthread.exp: Add tests for new_thread event. * gdb.python/py-inferior.exp: Add tests for new inferior events.
This commit is contained in:
parent
4ec521f238
commit
7c96f8c1da
14 changed files with 229 additions and 7 deletions
|
@ -30,6 +30,13 @@
|
|||
#include "py-event.h"
|
||||
#include "py-stopevent.h"
|
||||
|
||||
extern PyTypeObject new_thread_event_object_type
|
||||
CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("event_object");
|
||||
extern PyTypeObject new_inferior_event_object_type
|
||||
CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("event_object");
|
||||
extern PyTypeObject inferior_deleted_event_object_type
|
||||
CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("event_object");
|
||||
|
||||
struct threadlist_entry {
|
||||
thread_object *thread_obj;
|
||||
struct threadlist_entry *next;
|
||||
|
@ -235,6 +242,60 @@ inferior_to_inferior_object (struct inferior *inferior)
|
|||
return (PyObject *) inf_obj;
|
||||
}
|
||||
|
||||
/* Called when a new inferior is created. Notifies any Python event
|
||||
listeners. */
|
||||
static void
|
||||
python_new_inferior (struct inferior *inf)
|
||||
{
|
||||
if (!gdb_python_initialized)
|
||||
return;
|
||||
|
||||
gdbpy_enter enter_py (python_gdbarch, python_language);
|
||||
|
||||
if (evregpy_no_listeners_p (gdb_py_events.new_inferior))
|
||||
return;
|
||||
|
||||
gdbpy_ref<> inf_obj (inferior_to_inferior_object (inf));
|
||||
if (inf_obj == NULL)
|
||||
{
|
||||
gdbpy_print_stack ();
|
||||
return;
|
||||
}
|
||||
|
||||
gdbpy_ref<> event (create_event_object (&new_inferior_event_object_type));
|
||||
if (event == NULL
|
||||
|| evpy_add_attribute (event.get (), "inferior", inf_obj.get ()) < 0
|
||||
|| evpy_emit_event (event.get (), gdb_py_events.new_inferior) < 0)
|
||||
gdbpy_print_stack ();
|
||||
}
|
||||
|
||||
/* Called when an inferior is removed. Notifies any Python event
|
||||
listeners. */
|
||||
static void
|
||||
python_inferior_deleted (struct inferior *inf)
|
||||
{
|
||||
if (!gdb_python_initialized)
|
||||
return;
|
||||
|
||||
gdbpy_enter enter_py (python_gdbarch, python_language);
|
||||
|
||||
if (evregpy_no_listeners_p (gdb_py_events.inferior_deleted))
|
||||
return;
|
||||
|
||||
gdbpy_ref<> inf_obj (inferior_to_inferior_object (inf));
|
||||
if (inf_obj == NULL)
|
||||
{
|
||||
gdbpy_print_stack ();
|
||||
return;
|
||||
}
|
||||
|
||||
gdbpy_ref<> event (create_event_object (&inferior_deleted_event_object_type));
|
||||
if (event == NULL
|
||||
|| evpy_add_attribute (event.get (), "inferior", inf_obj.get ()) < 0
|
||||
|| evpy_emit_event (event.get (), gdb_py_events.inferior_deleted) < 0)
|
||||
gdbpy_print_stack ();
|
||||
}
|
||||
|
||||
/* Finds the Python Inferior object for the given PID. Returns a
|
||||
reference, or NULL if PID does not match any inferior object. */
|
||||
|
||||
|
@ -298,6 +359,15 @@ add_thread_object (struct thread_info *tp)
|
|||
|
||||
inf_obj->threads = entry;
|
||||
inf_obj->nthreads++;
|
||||
|
||||
if (evregpy_no_listeners_p (gdb_py_events.new_thread))
|
||||
return;
|
||||
|
||||
gdbpy_ref<> event (create_thread_event_object (&new_thread_event_object_type,
|
||||
(PyObject *) thread_obj));
|
||||
if (event == NULL
|
||||
|| evpy_emit_event (event.get (), gdb_py_events.new_thread) < 0)
|
||||
gdbpy_print_stack ();
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -823,6 +893,8 @@ gdbpy_initialize_inferior (void)
|
|||
observer_attach_register_changed (python_on_register_change);
|
||||
observer_attach_inferior_exit (python_inferior_exit);
|
||||
observer_attach_new_objfile (python_new_objfile);
|
||||
observer_attach_inferior_added (python_new_inferior);
|
||||
observer_attach_inferior_removed (python_inferior_deleted);
|
||||
|
||||
membuf_object_type.tp_new = PyType_GenericNew;
|
||||
if (PyType_Ready (&membuf_object_type) < 0)
|
||||
|
@ -970,3 +1042,19 @@ PyTypeObject membuf_object_type = {
|
|||
0, /* tp_init */
|
||||
0, /* tp_alloc */
|
||||
};
|
||||
|
||||
GDBPY_NEW_EVENT_TYPE (new_thread,
|
||||
"gdb.NewThreadEvent",
|
||||
"NewThreadEvent",
|
||||
"GDB new thread event object",
|
||||
thread_event_object_type);
|
||||
GDBPY_NEW_EVENT_TYPE (new_inferior,
|
||||
"gdb.NewInferiorEvent",
|
||||
"NewInferiorEvent",
|
||||
"GDB new inferior event object",
|
||||
event_object_type);
|
||||
GDBPY_NEW_EVENT_TYPE (inferior_deleted,
|
||||
"gdb.InferiorDeletedEvent",
|
||||
"InferiorDeletedEvent",
|
||||
"GDB inferior deleted event object",
|
||||
event_object_type);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue