* libdwfl/libdwfl.h (dwfl_process_tracker_find_pid): New function.
* libdwfl/dwfl_process_tracker.h (dwfl_process_tracker_find_pid):
New function; find a Dwfl in the dwfltab or create one using the
provided callback.
* libdw/libdw.map: Add dwfl_process_tracker_find_pid.
dwfl_begin_with_tracker;
dwfl_process_tracker_end;
dwfl_process_tracker_find_elf;
+ dwfl_process_tracker_find_pid;
} ELFUTILS_0.192;
return dwfl;
}
+Dwfl *dwfl_process_tracker_find_pid (Dwfl_Process_Tracker *tracker,
+ pid_t pid,
+ Dwfl *(*callback) (Dwfl_Process_Tracker *,
+ pid_t, void *),
+ void *arg)
+{
+ Dwfl *dwfl = NULL;
+ dwfltracker_dwfl_info *ent = dwfltracker_dwfltab_find(&tracker->dwfltab, pid);
+ if (ent != NULL && !ent->invalid)
+ dwfl = ent->dwfl;
+ if (dwfl == NULL && callback != NULL)
+ dwfl = callback(tracker, pid, arg);
+ if (dwfl != NULL)
+ {
+ assert (dwfl->tracker == tracker);
+ /* XXX: dwfl added to dwfltab when dwfl->process set in dwfl_attach_state. */
+ }
+
+ return dwfl;
+}
+
void __libdwfl_add_dwfl_to_tracker (Dwfl *dwfl) {
Dwfl_Process_Tracker *tracker = dwfl->tracker;
assert (tracker != NULL);
extern Dwfl *dwfl_begin_with_tracker (Dwfl_Process_Tracker *tracker)
__nonnull_attribute__ (1);
+/* Find the Dwfl corresponding to PID. If CALLBACK is non-NULL
+ and the Dwfl has not been created, invoke CALLBACK to create
+ the Dwfl and then store it in the tracker. */
+extern Dwfl *dwfl_process_tracker_find_pid (Dwfl_Process_Tracker *tracker,
+ pid_t pid,
+ Dwfl *(*callback) (Dwfl_Process_Tracker *tracker,
+ pid_t pid,
+ void *arg),
+ void *arg)
+ __nonnull_attribute__ (1);
+
/* End a multi-process session. */
extern void dwfl_process_tracker_end (Dwfl_Process_Tracker *tracker);