aboutsummaryrefslogtreecommitdiff
path: root/gdb/python
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/python')
-rw-r--r--gdb/python/py-all-events.def1
-rw-r--r--gdb/python/py-event-types.def5
-rw-r--r--gdb/python/py-event.h3
-rw-r--r--gdb/python/py-inferior.c3
-rw-r--r--gdb/python/py-threadevent.c21
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);
+}