void FatalSignalCallbackRegistry::run() {
if (!installed_) {
- return; // Shouldn't happen
+ return;
}
for (auto& fn : handlers_) {
gFatalSignalCallbackRegistry->add(cb);
}
+void installFatalSignalCallbacks() {
+ gFatalSignalCallbackRegistry->markInstalled();
+}
+
namespace {
std::atomic<bool> gAlreadyInstalled;
return;
}
- gFatalSignalCallbackRegistry->markInstalled();
-
struct sigaction sa;
memset(&sa, 0, sizeof(sa));
sigemptyset(&sa.sa_mask);
*/
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).
* 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);
+/**
+ * Install the fatal signal callbacks; fatal signals will call these
+ * callbacks in the order in which they were added.
+ */
+void installFatalSignalCallbacks();
+
}} // namespaces
char mangledBuf[1024];
if (!frame.found) {
- doPrint(" (not found)\n");
+ doPrint(" (not found)");
return;
}
if (frame.name.empty()) {
- doPrint(" (unknown)\n");
+ doPrint(" (unknown)");
} else if (frame.name.size() >= sizeof(mangledBuf)) {
doPrint(" ");
doPrint(frame.name);