Separate installFatalSignalCallbacks
authorTudor Bosman <tudorb@fb.com>
Tue, 10 Dec 2013 22:41:28 +0000 (14:41 -0800)
committerJordan DeLong <jdelong@fb.com>
Fri, 20 Dec 2013 21:05:58 +0000 (13:05 -0800)
Summary:
We want to install the signal handler first and then give users an opportunity
to add their callbacks.

Test Plan: built

Reviewed By: lucian@fb.com

FB internal diff: D1092083

@override-unit-failures

folly/experimental/symbolizer/SignalHandler.cpp
folly/experimental/symbolizer/SignalHandler.h
folly/experimental/symbolizer/Symbolizer.cpp

index dc34c23557ac61dc7ae3e636e9296900bf188af6..5eb014052e8582c6d86b647c9d3bac1c8af866b1 100644 (file)
@@ -77,7 +77,7 @@ void FatalSignalCallbackRegistry::markInstalled() {
 
 void FatalSignalCallbackRegistry::run() {
   if (!installed_) {
 
 void FatalSignalCallbackRegistry::run() {
   if (!installed_) {
-    return;  // Shouldn't happen
+    return;
   }
 
   for (auto& fn : handlers_) {
   }
 
   for (auto& fn : handlers_) {
@@ -251,6 +251,10 @@ void addFatalSignalCallback(SignalCallback cb) {
   gFatalSignalCallbackRegistry->add(cb);
 }
 
   gFatalSignalCallbackRegistry->add(cb);
 }
 
+void installFatalSignalCallbacks() {
+  gFatalSignalCallbackRegistry->markInstalled();
+}
+
 namespace {
 
 std::atomic<bool> gAlreadyInstalled;
 namespace {
 
 std::atomic<bool> gAlreadyInstalled;
@@ -263,8 +267,6 @@ void installFatalSignalHandler() {
     return;
   }
 
     return;
   }
 
-  gFatalSignalCallbackRegistry->markInstalled();
-
   struct sigaction sa;
   memset(&sa, 0, sizeof(sa));
   sigemptyset(&sa.sa_mask);
   struct sigaction sa;
   memset(&sa, 0, sizeof(sa));
   sigemptyset(&sa.sa_mask);
index febe6e665fd5b4c184c546ccbc26914d9c2cf571..65cab8666ca01675ddb1e4055e9885bfca727cd0 100644 (file)
@@ -30,7 +30,6 @@ namespace folly { namespace symbolizer {
  */
 void installFatalSignalHandler();
 
  */
 void installFatalSignalHandler();
 
-
 /**
  * Add a callback to be run when receiving a fatal signal. They will also
  * be called by LOG(FATAL) and abort() (as those raise SIGABRT internally).
 /**
  * Add a callback to be run when receiving a fatal signal. They will also
  * be called by LOG(FATAL) and abort() (as those raise SIGABRT internally).
@@ -39,11 +38,17 @@ void installFatalSignalHandler();
  * LOG(...) or printf or malloc / new or doing anything even remotely fun.
  *
  * All these fatal callback must be added before calling
  * LOG(...) or printf or malloc / new or doing anything even remotely fun.
  *
  * All these fatal callback must be added before calling
- * installFatalSignalHandler().
+ * installFatalSignalCallbacks(), below.
  */
 typedef void (*SignalCallback)(void);
 void addFatalSignalCallback(SignalCallback callback);
 
  */
 typedef void (*SignalCallback)(void);
 void addFatalSignalCallback(SignalCallback callback);
 
+/**
+ * Install the fatal signal callbacks; fatal signals will call these
+ * callbacks in the order in which they were added.
+ */
+void installFatalSignalCallbacks();
+
 
 }}  // namespaces
 
 
 }}  // namespaces
 
index 2719caaa54221c3f14860c47ca8815714782035e..d0f0c1650435f52c02de280b945a754735777c01 100644 (file)
@@ -269,12 +269,12 @@ void SymbolizePrinter::print(uintptr_t address, const SymbolizedFrame& frame) {
 
   char mangledBuf[1024];
   if (!frame.found) {
 
   char mangledBuf[1024];
   if (!frame.found) {
-    doPrint(" (not found)\n");
+    doPrint(" (not found)");
     return;
   }
 
   if (frame.name.empty()) {
     return;
   }
 
   if (frame.name.empty()) {
-    doPrint(" (unknown)\n");
+    doPrint(" (unknown)");
   } else if (frame.name.size() >= sizeof(mangledBuf)) {
     doPrint(" ");
     doPrint(frame.name);
   } else if (frame.name.size() >= sizeof(mangledBuf)) {
     doPrint(" ");
     doPrint(frame.name);