| 647 | static std::mutex g_signal_handler_mutex; |
| 648 | |
| 649 | void on_signal(int signal) |
| 650 | { |
| 651 | if (reported_signal_error.test_and_set()) { |
| 652 | return; |
| 653 | } |
| 654 | |
| 655 | std::unique_lock<std::mutex> lock(g_signal_handler_mutex); |
| 656 | auto seed = g_seed.load(std::memory_order_acquire); |
| 657 | |
| 658 | // Technically undefined behaviour to use stdlib functions, |
| 659 | // but oh well |
| 660 | const char* error = signal == SIGABRT ? |
| 661 | "Abort detected (assertion failed?)" : |
| 662 | "Segmentation fault detected!"; |
| 663 | |
| 664 | { |
| 665 | std::ofstream fout(LOG_FILE, std::ios::app); |
| 666 | fout << "*** " << error << "\n Seed: " << std::hex << seed << std::endl; |
| 667 | } |
| 668 | std::printf("*** %s\n Seed: %08x%08x\n", error, (uint32_t)(seed >> 32), (uint32_t)(seed)); |
| 669 | std::fflush(stdout); |
| 670 | } |
| 671 | |
| 672 | extern "C" void signal_handler(int signal) |
| 673 | { |
no test coverage detected