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

Reply via email to