mirror of
https://github.com/tobast/libunwind-eh_elf.git
synced 2024-12-28 13:53:43 +01:00
84d4150668
Greetings, We use libunwind just for stack traces (I suspect many others do as well). The use pattern is: GetStackTrace(void** result, int max_depth) { ... unw_getcontext(&uc); unw_init_local(&cursor, &uc); while (n < max_depth) { if (unw_get_reg(&cursor, UNW_REG_IP, (unw_word_t *) &ip) < 0) { break; } result[n++] = ip; if (unw_step(&cursor) <= 0) { break; } } Given this usage, it is quite convenient for us to block signals (or prevent signal handlers from re-entering libunwind by other means) at the "top level", which makes most of the sigprocmask calls performed by libunwind itself unneccessary. The second patch in this series adds a configure option which removes most of the sigprocmask calls. Attached patch is a preliminary for it -- consolidating all of the "sigprocmask; mutex_lock;" sequences into lock_acquire and "mutex_unlock; sigprocmask;" sequences into lock_release. Thanks, -- Paul Pluzhnikov commit 402d15b123d54a7669db7cf17a76dd315094e472 Author: Paul Pluzhnikov <ppluzhnikov@google.com> Date: Mon Sep 21 10:18:28 2009 -0700 Replace "sigprocmask + mutext_lock" with a single lock_acquire. Likewise, replace "mutext_unlock + sigprocmask" with lock_release. |
||
---|---|---|
.. | ||
Gcreate_addr_space.c | ||
gen-offsets.c | ||
getcontext.S | ||
Gget_proc_info.c | ||
Gget_save_loc.c | ||
Gglobal.c | ||
Ginit.c | ||
Ginit_local.c | ||
Ginit_remote.c | ||
Gis_signal_frame.c | ||
Gregs.c | ||
Gresume.c | ||
Gstep.c | ||
init.h | ||
is_fpreg.c | ||
Lcreate_addr_space.c | ||
Lget_proc_info.c | ||
Lget_save_loc.c | ||
Lglobal.c | ||
Linit.c | ||
Linit_local.c | ||
Linit_remote.c | ||
Lis_signal_frame.c | ||
Lregs.c | ||
Lresume.c | ||
Lstep.c | ||
offsets.h | ||
regname.c | ||
siglongjmp.S | ||
unwind_i.h |