[PATCH, libfortran] PR 88137 Initialize backtrace state once

Jerry DeLisle jvdelisle@charter.net
Fri Nov 30 14:36:00 GMT 2018


On 11/29/18 11:37 PM, Janne Blomqvist wrote:
> PING!
> 

LGTM,

OK and thanks

Jerry

> (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.janne@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  <jb@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
>>
>>
> 



More information about the Fortran mailing list