Repository: trafficserver
Updated Branches:
  refs/heads/master ab0844c82 -> c6899fb98


[TS-2665] Clean up ink_stack_trace_dump code


Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/c6899fb9
Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/c6899fb9
Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/c6899fb9

Branch: refs/heads/master
Commit: c6899fb9873902426580bffb84a1206c6cfdf7b1
Parents: ab0844c
Author: Brian Geffon <[email protected]>
Authored: Wed Mar 26 11:46:30 2014 -0700
Committer: Brian Geffon <[email protected]>
Committed: Wed Mar 26 11:46:30 2014 -0700

----------------------------------------------------------------------
 CHANGES                   |  3 +++
 lib/ts/ink_stack_trace.cc | 19 +++++++++++++------
 2 files changed, 16 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/trafficserver/blob/c6899fb9/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index acfb425..24b9357 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,9 @@
                                                          -*- coding: utf-8 -*-
 Changes with Apache Traffic Server 5.0.0
 
+  *) [TS-2665] Clean up ink_stack_trace_dump code
+   Thanks to Alexey Ivanov <[email protected]> for reporting this issue.
+
   *) [TS-2663] Wrong condition on log code for server connection errors.
    Author: David Binderman <[email protected]>
 

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/c6899fb9/lib/ts/ink_stack_trace.cc
----------------------------------------------------------------------
diff --git a/lib/ts/ink_stack_trace.cc b/lib/ts/ink_stack_trace.cc
index 3e194dd..17f9ddc 100644
--- a/lib/ts/ink_stack_trace.cc
+++ b/lib/ts/ink_stack_trace.cc
@@ -29,6 +29,10 @@
 #include <stdlib.h>
 #include <unistd.h>
 
+#ifndef STDERR_FILENO
+#define STDERR_FILENO 2
+#endif
+
 #if TS_HAS_BACKTRACE
 
 #include <execinfo.h>           /* for backtrace_symbols, etc. */
@@ -40,19 +44,22 @@ ink_stack_trace_dump()
   int btl;
 
   // Recopy and re-terminate the app name in case it has been trashed.
-  char name[256];
   const char *msg = " - STACK TRACE: \n";
-  ink_strlcpy(name, program_name, sizeof(name));
-  if (write(2, name, strlen(name)) == -1)
+  if (write(STDERR_FILENO, program_name, strlen(program_name)) == -1)
     return;
-  if (write(2, msg, strlen(msg)) == -1)
+  if (write(STDERR_FILENO, msg, strlen(msg)) == -1)
     return;
 
+  // In certain situations you can get stuck in malloc waiting for a lock
+  // that your program held when it segfaulted. We set an alarm so that
+  // if this situation happens it will allow traffic_server to exit.
+  alarm(10);
+
   void *stack[INK_STACK_TRACE_MAX_LEVELS + 1];
   memset(stack, 0, sizeof(stack));
   if ((btl = backtrace(stack, INK_STACK_TRACE_MAX_LEVELS)) > 2) {
     // dump the backtrace to stderr
-    backtrace_symbols_fd(stack + 2, btl - 2, 2);
+    backtrace_symbols_fd(stack + 2, btl - 2, STDERR_FILENO);
   }
 }
 
@@ -62,7 +69,7 @@ void
 ink_stack_trace_dump()
 {
   const char msg[] = "ink_stack_trace_dump not implemented on this operating 
system\n";
-  if (write(2, msg, sizeof(msg) - 1) == -1)
+  if (write(STDERR_FILENO, msg, sizeof(msg) - 1) == -1)
       return;
 }
 

Reply via email to