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.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




Reply via email to