Add support for a custom, per-instance signal handler (#620)
* Per Instance signal handler * add custom signal handler test * add instance signal handling to callable.rs * extend signal handler test to test callable.rs * test multiple instances, multiple signal handlers * support more than one current instance import_calling_export.rs is a good example of why this is needed: execution switches from one instance to another before the first one has finished running * add another custom signal handler test case * move and update custom signal handler tests * fmt * fix libc version to 0.2 * call the correct instance signal handler We keep a stack of instances so should call last() not first(). * move custom signal handler test to top level dir * windows/mac signal handling wip * os-specific signal handling wip * disable custom signal handler test on windows * fmt * unify signal handling on mac and linux
This commit is contained in:
@@ -467,9 +467,13 @@ WasmTrapHandler(LPEXCEPTION_POINTERS exception)
|
||||
return EXCEPTION_CONTINUE_SEARCH;
|
||||
}
|
||||
|
||||
if (!HandleTrap(exception->ContextRecord,
|
||||
record->ExceptionCode == EXCEPTION_STACK_OVERFLOW)) {
|
||||
return EXCEPTION_CONTINUE_SEARCH;
|
||||
bool handled = InstanceSignalHandler(exception);
|
||||
|
||||
if (!handled) {
|
||||
if (!HandleTrap(exception->ContextRecord,
|
||||
record->ExceptionCode == EXCEPTION_STACK_OVERFLOW)) {
|
||||
return EXCEPTION_CONTINUE_SEARCH;
|
||||
}
|
||||
}
|
||||
|
||||
return EXCEPTION_CONTINUE_EXECUTION;
|
||||
@@ -633,11 +637,17 @@ WasmTrapHandler(int signum, siginfo_t* info, void* context)
|
||||
if (!sAlreadyHandlingTrap) {
|
||||
AutoHandlingTrap aht;
|
||||
assert(signum == SIGSEGV || signum == SIGBUS || signum == SIGFPE || signum == SIGILL);
|
||||
|
||||
if (InstanceSignalHandler(signum, info, (ucontext_t*) context)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (HandleTrap(static_cast<CONTEXT*>(context), false)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
struct sigaction* previousSignal = nullptr;
|
||||
switch (signum) {
|
||||
case SIGSEGV: previousSignal = &sPrevSIGSEGVHandler; break;
|
||||
|
||||
@@ -7,6 +7,8 @@
|
||||
#include <stdbool.h>
|
||||
#endif
|
||||
|
||||
#include <signal.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
@@ -15,6 +17,17 @@ int8_t CheckIfTrapAtAddress(const uint8_t* pc);
|
||||
// Record the Trap code and wasm bytecode offset in TLS somewhere
|
||||
void RecordTrap(const uint8_t* pc, bool reset_guard_page);
|
||||
|
||||
#if defined(_WIN32)
|
||||
#include <windows.h>
|
||||
#include <winternl.h>
|
||||
bool InstanceSignalHandler(LPEXCEPTION_POINTERS);
|
||||
#elif defined(USE_APPLE_MACH_PORTS)
|
||||
bool InstanceSignalHandler(int, siginfo_t *, void *);
|
||||
#else
|
||||
#include <sys/ucontext.h>
|
||||
bool InstanceSignalHandler(int, siginfo_t *, ucontext_t *);
|
||||
#endif
|
||||
|
||||
void* EnterScope(void*);
|
||||
void LeaveScope(void*);
|
||||
void* GetScope(void);
|
||||
|
||||
Reference in New Issue
Block a user