diff options
Diffstat (limited to 'gdb/python')
-rw-r--r-- | gdb/python/py-all-events.def | 1 | ||||
-rw-r--r-- | gdb/python/py-event-types.def | 5 | ||||
-rw-r--r-- | gdb/python/py-event.h | 3 | ||||
-rw-r--r-- | gdb/python/py-inferior.c | 3 | ||||
-rw-r--r-- | gdb/python/py-threadevent.c | 21 |
5 files changed, 33 insertions, 0 deletions
diff --git a/gdb/python/py-all-events.def b/gdb/python/py-all-events.def index 4d711f7..aa28f2c 100644 --- a/gdb/python/py-all-events.def +++ b/gdb/python/py-all-events.def @@ -32,6 +32,7 @@ GDB_PY_DEFINE_EVENT(clear_objfiles) GDB_PY_DEFINE_EVENT(new_inferior) GDB_PY_DEFINE_EVENT(inferior_deleted) GDB_PY_DEFINE_EVENT(new_thread) +GDB_PY_DEFINE_EVENT(thread_exited) GDB_PY_DEFINE_EVENT(inferior_call) GDB_PY_DEFINE_EVENT(memory_changed) GDB_PY_DEFINE_EVENT(register_changed) diff --git a/gdb/python/py-event-types.def b/gdb/python/py-event-types.def index 2215c5e..395d6c0 100644 --- a/gdb/python/py-event-types.def +++ b/gdb/python/py-event-types.def @@ -51,6 +51,11 @@ GDB_PY_DEFINE_EVENT_TYPE (new_thread, "GDB new thread event object", thread_event_object_type); +GDB_PY_DEFINE_EVENT_TYPE (thread_exited, + "ThreadExitedEvent", + "GDB thread exited event object", + event_object_type); + GDB_PY_DEFINE_EVENT_TYPE (new_inferior, "NewInferiorEvent", "GDB new inferior event object", diff --git a/gdb/python/py-event.h b/gdb/python/py-event.h index 0a7d31d..01386dd 100644 --- a/gdb/python/py-event.h +++ b/gdb/python/py-event.h @@ -61,6 +61,9 @@ extern int emit_memory_changed_event (CORE_ADDR addr, ssize_t len); extern int evpy_emit_event (PyObject *event, eventregistry_object *registry); +/* Emits a thread exit event for THREAD */ +extern int emit_thread_exit_event (thread_info * thread); + extern gdbpy_ref<> create_event_object (PyTypeObject *py_type); /* thread events can either be thread specific or process wide. If gdb is diff --git a/gdb/python/py-inferior.c b/gdb/python/py-inferior.c index 8c4871d..af8bd88 100644 --- a/gdb/python/py-inferior.c +++ b/gdb/python/py-inferior.c @@ -371,6 +371,9 @@ delete_thread_object (struct thread_info *tp, int ignore) if (inf_obj == NULL) return; + if (emit_thread_exit_event (tp) < 0) + gdbpy_print_stack (); + auto it = inf_obj->threads->find (tp); if (it != inf_obj->threads->end ()) { diff --git a/gdb/python/py-threadevent.c b/gdb/python/py-threadevent.c index 05a833d..2b2a449 100644 --- a/gdb/python/py-threadevent.c +++ b/gdb/python/py-threadevent.c @@ -53,3 +53,24 @@ create_thread_event_object (PyTypeObject *py_type, PyObject *thread) return thread_event_obj; } + +/* Emits a thread exit event for THREAD */ + +int +emit_thread_exit_event (thread_info * thread) +{ + if (evregpy_no_listeners_p (gdb_py_events.thread_exited)) + return 0; + + auto py_thr = thread_to_thread_object (thread); + + if (py_thr == nullptr) + return -1; + + auto inf_thr = create_thread_event_object (&thread_exited_event_object_type, + py_thr.get ()); + if (inf_thr == nullptr) + return -1; + + return evpy_emit_event (inf_thr.get (), gdb_py_events.thread_exited); +} |