-
Xavier Thompson authored
Previously, an exception thrown from a fork was rethrown: - a) when the call to fork() returns if the fork completes synchronously - b) otherwise, at the next explicit call to Sync() if there is one - c) otherwise, when the call to the enclosing Join coroutine returns In the case of infinite fork loops, this meant exceptions might never be propagated. Now, when an exception is thrown from a fork it's always rethrown when the call to the enclosing Join coroutine returns. The body of the Join coroutine just stops executing as soon as possible once a fork signals an exception. This will be at the call to fork() if the fork completes synchronously, or at any ensuing call to Sync() or fork() otherwise. Essentially once an exception is signaled from a parallel fork, the next call to fork() behaves like Sync() instead of creating a fork, and once all the parallel forks have completed, execution resumes directly at the call to the enclosing Join coroutine, where the exception is rethrown.
e5e93a1d