]> git.ipfire.org Git - thirdparty/elfutils.git/commit
libdwfl_stacktrace [8/12]: Dwfl* caching via Dwflst_Process_Tracker
authorSerhei Makarov <serhei@serhei.io>
Fri, 7 Mar 2025 17:41:40 +0000 (12:41 -0500)
committerSerhei Makarov <serhei@serhei.io>
Fri, 25 Apr 2025 14:10:04 +0000 (10:10 -0400)
commit592620d4dca43b0208f8c97a2e0567351b4666a0
tree911e906183322f9f31f7c866d199dae2461fd067
parentbf2ef65fb5ccbd145776a1cc242d201d73687820
libdwfl_stacktrace [8/12]: Dwfl* caching via Dwflst_Process_Tracker

Changes for v6:

- Minor fixes as requested.

Changes for v4:

- Separate out libdwfl_stacktrace, as requested.

Changes for v3:

- Handle dwfl->process == NULL case in __libdwfl_remove_dwfl_from_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.
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