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.

Reply via email to