A tool to manage threads.
Sets signal and exception handlers. Windows-specific notes< > Compiled with MS VC++ sets 3 main handlers:
- Signal handlers (via ::signal() functions) that translate system signals (SIGSEGV, SIGFPE, SIGILL) into C++ exceptions (classes inheriting Standard_Failure). They only be called if user calls ::raise() function with one of supported signal type set.
- Exception handler OSD::WntHandler() (via ::SetUnhandledExceptionFilter()) that will be used when user's code is compiled with /EHs option.
- Structured exception (SE) translator (via _set_se_translator()) that translates SE exceptions (aka asynchronous exceptions) into the C++ exceptions inheriting Standard_Failure. This translator will be used when user's code is compiled with /EHa option.
This approach ensures that regardless of the option the user chooses to compile his code with (/EHs or /EHa), signals (or SE exceptions) will be translated into Open CASCADE C++ exceptions.
If theFloatingSignal is TRUE then floating point exceptions will be generated in accordance with the mask _EM_INVALID | _EM_DENORMAL | _EM_ZERODIVIDE | _EM_OVERFLOW<> that is used to call ::_controlfp() system function. If theFloatingSignal is FALSE corresponding operations (e.g. division by zero) will gracefully complete without an exception.
Unix-specific notes< > OSD::SetSignal() sets handlers (via ::sigaction()) for multiple signals (SIGFPE, SIGSEGV, etc). Currently the number of handled signals is much greater than for Windows, in the future this may change to provide better consistency with Windows.
theFloatingSignal is recognized on Sun Solaris, Linux, and SGI Irix to generate floating-point exception according to the mask FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW
(in Linux conventions).
When compiled with OBJS macro defined, already set signal handlers (e.g. by Data Base Managers) are not redefined.
Common notes< > If OSD::SetSignal() method is used in at least one thread, it must also be called in any other thread where Open CASCADE will be used, to ensure consistency of behavior. Its aFloatingSignal argument must be consistent across threads.
Keep in mind that whether the C++ exception will really be thrown (i.e. ::throw() will be called) is regulated by the NO_CXX_EXCEPTIONS and OCC_CONVERT_SIGNALS macros used during compilation of Open CASCADE and user's code. Refer to Foundation Classes User's Guide for further details.