1 #include "../general_protection_fault.h"
3 #include "../../except.h"
5 #include "../../thread_info.h"
12 struct floating_point_exception : virtual caspar_exception {};
13 struct segmentation_fault_exception : virtual caspar_exception {};
15 void catch_fpe(int signum)
19 CASPAR_THROW_EXCEPTION(floating_point_exception());
23 CASPAR_LOG_CURRENT_EXCEPTION();
28 void catch_segv(int signum)
32 CASPAR_THROW_EXCEPTION(segmentation_fault_exception());
36 CASPAR_LOG_CURRENT_EXCEPTION();
41 void do_install_handlers()
43 signal(SIGFPE, catch_fpe);
44 signal(SIGSEGV, catch_segv);
47 void install_gpf_handler()
49 ensure_gpf_handler_installed_for_thread();
52 void ensure_gpf_handler_installed_for_thread(
53 const char* thread_description)
55 static const int MAX_LINUX_THREAD_NAME_LEN = 15;
56 static auto install = []() { do_install_handlers(); return 0; } ();
58 auto& for_thread = get_thread_info();
60 if (thread_description && for_thread.name.empty())
62 for_thread.name = thread_description;
64 std::string kernel_thread_name = for_thread.name;
66 if (kernel_thread_name.length() > MAX_LINUX_THREAD_NAME_LEN)
67 kernel_thread_name.resize(MAX_LINUX_THREAD_NAME_LEN);
69 pthread_setname_np(pthread_self(), kernel_thread_name.c_str());