mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-10 07:40:26 +08:00
Use atomic load/store to access static backtrace state pointer
As the static backtrace state pointer can be accessed from multiple threads, use atomics to access it. Regtested on x86_64-pc-linux-gnu. libgfortran/ChangeLog: 2018-12-02 Janne Blomqvist <jb@gcc.gnu.org> PR libfortran/88137 * runtime/backtrace.c (show_backtrace): Use atomic load/store to access the static lbstate pointer. From-SVN: r266724
This commit is contained in:
parent
4a82df9a38
commit
df996c3fd2
libgfortran
@ -1,3 +1,9 @@
|
||||
2018-12-02 Janne Blomqvist <jb@gcc.gnu.org>
|
||||
|
||||
PR libfortran/88137
|
||||
* runtime/backtrace.c (show_backtrace): Use atomic load/store to
|
||||
access the static lbstate pointer.
|
||||
|
||||
2018-11-30 Janne Blomqvist <jb@gcc.gnu.org>
|
||||
|
||||
PR libfortran/88137
|
||||
|
@ -149,15 +149,20 @@ show_backtrace (bool in_signal_handler)
|
||||
/* 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;
|
||||
static struct backtrace_state *lbstate_saved;
|
||||
struct backtrace_state *lbstate;
|
||||
struct mystate state = { 0, false, in_signal_handler };
|
||||
|
||||
lbstate = __atomic_load_n (&lbstate_saved, __ATOMIC_RELAXED);
|
||||
if (!lbstate)
|
||||
lbstate = backtrace_create_state (NULL, __gthread_active_p (),
|
||||
error_callback, NULL);
|
||||
|
||||
if (lbstate == NULL)
|
||||
return;
|
||||
{
|
||||
lbstate = backtrace_create_state (NULL, __gthread_active_p (),
|
||||
error_callback, NULL);
|
||||
if (lbstate)
|
||||
__atomic_store_n (&lbstate_saved, lbstate, __ATOMIC_RELAXED);
|
||||
else
|
||||
return;
|
||||
}
|
||||
|
||||
if (!BACKTRACE_SUPPORTED || (in_signal_handler && BACKTRACE_USES_MALLOC))
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user