Add gdb.free_objfile event registry

Currently, Python code can use event registries to detect when gdb
loads a new objfile, and when gdb clears the objfile list.  However,
there's no way to detect the removal of an objfile, say when the
inferior calls dlclose.

This patch adds a gdb.free_objfile event registry and arranges for an
event to be emitted in this case.
This commit is contained in:
Tom Tromey
2022-06-20 11:30:04 -06:00
parent 23948f5602
commit 0b4fe76f95
9 changed files with 208 additions and 0 deletions

View File

@ -53,6 +53,42 @@ emit_new_objfile_event (struct objfile *objfile)
return -1;
}
/* Create an event object representing a to-be-freed objfile. Return
nullptr, with the Python exception set, on error. */
static gdbpy_ref<>
create_free_objfile_event_object (struct objfile *objfile)
{
gdbpy_ref<> objfile_event
= create_event_object (&free_objfile_event_object_type);
if (objfile_event == nullptr)
return nullptr;
gdbpy_ref<> py_objfile = objfile_to_objfile_object (objfile);
if (py_objfile == nullptr
|| evpy_add_attribute (objfile_event.get (), "objfile",
py_objfile.get ()) < 0)
return nullptr;
return objfile_event;
}
/* Callback function which notifies observers when a free objfile
event occurs. This function will create a new Python event object.
Return -1 if emit fails. */
int
emit_free_objfile_event (struct objfile *objfile)
{
if (evregpy_no_listeners_p (gdb_py_events.free_objfile))
return 0;
gdbpy_ref<> event = create_free_objfile_event_object (objfile);
if (event == nullptr)
return -1;
return evpy_emit_event (event.get (), gdb_py_events.free_objfile);
}
/* Subroutine of emit_clear_objfiles_event to simplify it. */