mirror of
https://github.com/QIDITECH/QIDISlicer.git
synced 2026-02-01 00:18:44 +03:00
QIDISlicer1.0.0
This commit is contained in:
43
src/libslic3r/TryCatchSignalSEH.cpp
Normal file
43
src/libslic3r/TryCatchSignalSEH.cpp
Normal file
@@ -0,0 +1,43 @@
|
||||
#include "TryCatchSignalSEH.hpp"
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
static int signal_seh_filter(int sigcnt, const Slic3r::SignalT *sigs,
|
||||
unsigned long seh_code)
|
||||
{
|
||||
int ret = EXCEPTION_CONTINUE_SEARCH;
|
||||
|
||||
for (int s = 0; s < sigcnt && ret != EXCEPTION_EXECUTE_HANDLER; ++s)
|
||||
switch (sigs[s]) {
|
||||
case SIGSEGV:
|
||||
if (seh_code == STATUS_ACCESS_VIOLATION)
|
||||
ret = EXCEPTION_EXECUTE_HANDLER;
|
||||
break;
|
||||
case SIGILL:
|
||||
if (seh_code == STATUS_ILLEGAL_INSTRUCTION)
|
||||
ret = EXCEPTION_EXECUTE_HANDLER;
|
||||
break;
|
||||
case SIGFPE:
|
||||
if (seh_code == STATUS_FLOAT_DIVIDE_BY_ZERO ||
|
||||
seh_code == STATUS_FLOAT_OVERFLOW ||
|
||||
seh_code == STATUS_FLOAT_UNDERFLOW ||
|
||||
seh_code == STATUS_INTEGER_DIVIDE_BY_ZERO)
|
||||
ret = EXCEPTION_EXECUTE_HANDLER;
|
||||
break;
|
||||
default: ret = EXCEPTION_CONTINUE_SEARCH;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void Slic3r::detail::try_catch_signal_seh(int sigcnt, const SignalT *sigs,
|
||||
std::function<void()> &&fn,
|
||||
std::function<void()> &&cfn)
|
||||
{
|
||||
__try {
|
||||
fn();
|
||||
}
|
||||
__except(signal_seh_filter(sigcnt, sigs, GetExceptionCode())) {
|
||||
cfn();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user