Add ForkContext
This adds a Context implementation which uses pcntl_fork to create another process. This is a strategy which we abandoned some time ago due to the issues with copying parent context into a child, however there are particular case where that behavior can be advantageous.
This context is NOT added to DefaultContextFactory, and in fact has warnings against its use in the class docblock.
@danog Can you please check if this works for you in Psalm.
This does not work in psalm, because runContext is queueing a callback onto the event loop, which causes an immediate The event loop is already running error when hitting EventLoop::run(); unwrapping the callback fixes the issue.
Additionally, I added some extra error handling logic to handle segfaults in child processes (commonly caused by JIT usage in psalm), would love to see that in this impl as well: https://github.com/vimeo/psalm/blob/fc437245b15a7220de107bc191a3559fdbf94595/src/Psalm/Internal/Fork/ForkContext.php#L61
checkExit should probably also be executed within the constructor in a finally block as well, as https://github.com/vimeo/psalm/issues/11310 is caused by a crash quite possibly before the initial IPC handshake is completed, haven't further looked into this yet...
This does not work in psalm, because runContext is queueing a callback onto the event loop, which causes an immediate The event loop is already running error when hitting EventLoop::run(); unwrapping the callback fixes the issue.
My local test was running from {main}, so I missed that. Unfortunately running this new context through the usual test suite crashes and burns, of course because we're forking the test process.
I removed the event loop queuing from runContext and updated ForkContext with the recent changes you made. Give it another try when you get a chance.
What is the use case you mentioned?
What is the use case you mentioned?
@danog Can you please elaborate on how you're using this in Psalm?
I'm using this in psalm to avoid serializing and sending tens of megabytes of data structures containing information about the codebase post-scanning, when starting the analysis phase.
https://github.com/danog/parallel/tree/fork-context contains some more improvements and enables (most) unit tests, working OK in Psalm!
Ping @trowski :)