zorp-corp / sword

A modern Nock runtime with automatic persistence.
MIT License
94 stars 13 forks source link

`mprotect()` `SIGINT` #152

Open ashelkovnykov opened 10 months ago

ashelkovnykov commented 10 months ago

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.

eamsden commented 9 months ago

@ashelkovnykov how hard would this be to implement on top of what you've done for bail:meme?

eamsden commented 9 months ago

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.

ashelkovnykov commented 6 months ago

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.