`mprotect()` `SIGINT`
The current implementation of handling SIGINT signals in Ares from king sets a sentinel value which is polled on every call to Nock 2, Nock 9, and push to mean stack. If the sentinel value is set, the event bails with a non-deterministic error. If the sentinel value is already set when the user attempts to set it again, the serf process exits.
An alternative solution is to mprotect() the entire NockStack on SIGINT. The next access will hit SIGSEGV, from where we can un-protect the NockStack memory and bail with a non-deterministic error. A second call to SIGINT while the region is already mprotect()ed will kill the serf process.
@ashelkovnykov how hard would this be to implement on top of what you've done for bail:meme?
This would remove the need to check the TERMINATOR static flag on every 2 and 9. Instead, if an error was returned from the hw_exception::catch block in the interpreter, we could just return bail:alrm.
This should be pretty easy now that we have the C signal handler code for the guard page: just need to add some more handlers in the same lib.