August 31, 2016 You can call Fiber.yield() inside a vectored exception handler (win32) | ||||
---|---|---|---|---|
| ||||
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. |
Copyright © 1999-2021 by the D Language Foundation