PING! (for the GCC-7 branch, I'll commit it after the 7.4 release)
On Thu, Nov 22, 2018 at 11:17 AM Janne Blomqvist <blomqvist.ja...@gmail.com> wrote: > From backtrace.h for backtrace_create_state: > > Calling this function allocates resources that can not be freed. > There is no backtrace_free_state function. The state is used to > cache information that is expensive to recompute. Programs are > expected to call this function at most once and to save the return > value for all later calls to backtrace functions. > > So instead of calling backtrace_create_state every time we wish to > show a backtrace, do it once and store the result in a static > variable. libbacktrace allows multiple threads to access the state, > so no need to use TLS. > > Regtested on x86_64-pc-linux-gnu, Ok for trunk/8/7? > > libgfortran/ChangeLog: > > 2018-11-22 Janne Blomqvist <j...@gcc.gnu.org> > > PR libfortran/88137 > * runtime/backtrace.c (show_backtrace): Make lbstate a static > variable, initialize once. > --- > libgfortran/runtime/backtrace.c | 12 ++++++++---- > 1 file changed, 8 insertions(+), 4 deletions(-) > > diff --git a/libgfortran/runtime/backtrace.c > b/libgfortran/runtime/backtrace.c > index e0c277044b6..3fc973a5e6d 100644 > --- a/libgfortran/runtime/backtrace.c > +++ b/libgfortran/runtime/backtrace.c > @@ -146,11 +146,15 @@ full_callback (void *data, uintptr_t pc, const char > *filename, > void > show_backtrace (bool in_signal_handler) > { > - struct backtrace_state *lbstate; > + /* Note that libbacktrace allows the state to be accessed from > + multiple threads, so we don't need to use a TLS variable for the > + state here. */ > + static struct backtrace_state *lbstate; > struct mystate state = { 0, false, in_signal_handler }; > - > - lbstate = backtrace_create_state (NULL, __gthread_active_p (), > - error_callback, NULL); > + > + if (!lbstate) > + lbstate = backtrace_create_state (NULL, __gthread_active_p (), > + error_callback, NULL); > > if (lbstate == NULL) > return; > -- > 2.17.1 > > -- Janne Blomqvist