]> git.ipfire.org Git - thirdparty/elfutils.git/commit
libdwfl_stacktrace [8/12]: Dwfl* caching via Dwflst_Process_Tracker
authorSerhei Makarov <serhei@serhei.io>
Fri, 25 Apr 2025 14:55:50 +0000 (10:55 -0400)
committerAaron Merey <amerey@redhat.com>
Fri, 25 Apr 2025 15:55:15 +0000 (11:55 -0400)
commit11f5f216a47ac174bc7c24d9dbf4878cb23f45ee
treea18e3b9c5b25ab707cf56b3cda559af6dabe60d0
parent5f9c0eede42036560c23f5ede3bb60dc50aa8554
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.

Signed-off-by: Serhei Makarov <serhei@serhei.io>
libdwfl/dwfl_end.c
libdwfl/dwfl_frame.c
libdwfl/libdwflP.h
libdwfl_stacktrace/Makefile.am
libdwfl_stacktrace/dwflst_process_tracker.c
libdwfl_stacktrace/dwflst_tracker_dwfltab.c [new file with mode: 0644]
libdwfl_stacktrace/dwflst_tracker_dwfltab.h [new file with mode: 0644]
libdwfl_stacktrace/libdwfl_stacktraceP.h