• Xavier Thompson's avatar
    Rethink exception propagation from forks · e5e93a1d
    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
join.hpp 3.32 KB