mirror of git://gcc.gnu.org/git/gcc.git
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
|
@ -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>
|
2018-11-30 Janne Blomqvist <jb@gcc.gnu.org>
|
||||||
|
|
||||||
PR libfortran/88137
|
PR libfortran/88137
|
||||||
|
|
|
@ -149,15 +149,20 @@ show_backtrace (bool in_signal_handler)
|
||||||
/* Note that libbacktrace allows the state to be accessed from
|
/* Note that libbacktrace allows the state to be accessed from
|
||||||
multiple threads, so we don't need to use a TLS variable for the
|
multiple threads, so we don't need to use a TLS variable for the
|
||||||
state here. */
|
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 };
|
struct mystate state = { 0, false, in_signal_handler };
|
||||||
|
|
||||||
|
lbstate = __atomic_load_n (&lbstate_saved, __ATOMIC_RELAXED);
|
||||||
if (!lbstate)
|
if (!lbstate)
|
||||||
lbstate = backtrace_create_state (NULL, __gthread_active_p (),
|
{
|
||||||
error_callback, NULL);
|
lbstate = backtrace_create_state (NULL, __gthread_active_p (),
|
||||||
|
error_callback, NULL);
|
||||||
if (lbstate == NULL)
|
if (lbstate)
|
||||||
return;
|
__atomic_store_n (&lbstate_saved, lbstate, __ATOMIC_RELAXED);
|
||||||
|
else
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!BACKTRACE_SUPPORTED || (in_signal_handler && BACKTRACE_USES_MALLOC))
|
if (!BACKTRACE_SUPPORTED || (in_signal_handler && BACKTRACE_USES_MALLOC))
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue