In case anyone was wondering, in 32-bit Windows you can call
Fiber.yield() from inside a vectored exception handler, and
subsequently resume the fibre again.
As far as I can tell it works flawlessly.
Here's a little example:
---
extern(Windows) int on_exception_global(EXCEPTION_POINTERS* X)
nothrow {
/* once installed, this function will be called for every
exception raised in the current process */
if (X.ExceptionRecord.ExceptionCode == STATUS_ACCESS_VIOLATION) {
Fibre.yield(); // can do!
// retry the instruction that raised the exception
return EXCEPTION_CONTINUE_EXECUTION;
};
// call next exception handler
return EXCEPTION_CONTINUE_SEARCH;
};
auto Hdl = enforce(AddVectoredExceptionHandler(
1, /* insert at front of exception-handler chain */
&on_exception_global
));
---
Careful about throwing from inside your exception handler (any
kind of software or hardware exception, not limited to
'Throwable'). Don't want to end up in an infinite loop.