libdwfl_stacktrace [8/12]: Dwfl* caching via Dwflst_Process_Tracker
The Dwflst_Process_Tracker also includes a dynamicsizehash cache which
maps process ids to Dwfl * (or rather, dwflst_tracker_dwfl_info *
allowing the table entry to be replaced). Dwfls created from
the tracker are automatically added to it, and removed on dwfl_end().
* libdwfl_stacktrace/libdwfl_stacktraceP.h (dwflst_tracker_dwfl_info):
New typedef, provides indirection to allow a dwfltab entry to be
invalidated.
(struct Dwflst_Process_Tracker): add dwfltab.
(__libdwfl_stacktrace_add_dwfl_to_tracker): New function.
(__libdwfl_stacktrace_remove_dwfl_from_tracker): New function.
* libdwfl_stacktrace/dwflst_process_tracker.c
(dwflst_tracker_begin): Init dwfltab.
(__libdwfl_stacktrace_add_dwfl_to_tracker): New function; add dwfl
to dwfltab.
(__libdwfl_stacktrace_remove_dwfl_from_tracker): New function;
invalidate dwfl entry, since dynamicsizehash doesn't support
outright deletion.
(dwflst_tracker_end): Clean up dwfltab. Lock and iterate the table
to free tracker->dwfltab.table items.
* libdwfl_stacktrace/dwflst_tracker_dwfltab.c: New file, instantiates
lib/dynamicsizehash_concurrent.c to store dwfltracker_dwfl_info
structs.
* libdwfl_stacktrace/dwflst_tracker_dwfltab.h: New file, ditto.
* libdwfl_stacktrace/Makefile.am
(libdwfl_stacktrace_a_SOURCES): Add dwflst_tracker_dwfltab.c.
(noinst_HEADERS): Add dwflst_tracker_dwfltab.h.
* libdwfl/dwfl_frame.c (dwfl_attach_state):
Call __libdwfl_stacktrace_add_dwfl_to_tracker.
* libdwfl/dwfl_end.c (dwfl_end): Add INTDEF.
Call __libdwfl_stacktrace_remove_dwfl_from_tracker.
* libdwfl/libdwflP.h (INTDECLs): Add dwfl_end.