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
void FatalSignalCallbackRegistry::run() {
if (!installed_) {
void FatalSignalCallbackRegistry::run() {
if (!installed_) {
- return; // Shouldn't happen
}
for (auto& fn : handlers_) {
}
for (auto& fn : handlers_) {
gFatalSignalCallbackRegistry->add(cb);
}
gFatalSignalCallbackRegistry->add(cb);
}
+void installFatalSignalCallbacks() {
+ gFatalSignalCallbackRegistry->markInstalled();
+}
+
namespace {
std::atomic<bool> gAlreadyInstalled;
namespace {
std::atomic<bool> gAlreadyInstalled;
- 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);
*/
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).
* 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();
+
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");
} else if (frame.name.size() >= sizeof(mangledBuf)) {
doPrint(" ");
doPrint(frame.name);
} else if (frame.name.size() >= sizeof(mangledBuf)) {
doPrint(" ");
doPrint(frame.name);