What is important here is that it performs the procedure call just as if it were a sequential call. It also records the fact that the procedure call is a fork point. This way, the runtime system knows that the rest of f can progress even when g is blocked, or when an idle worker shows up. In this case, we must be able to suspend execution of g for now and later resume it when m is unlocked.
Subsequent procedure calls by f allocate a frame above g .
When g later restarts its computation, g frame is logically connected to the current frame and becomes the child of it. This frame may of course be different from g 's original caller. When g terminates, the control returns to the new parent, not the original caller. In general, each worker maintains its stack pointer below any unfinished frame. Frames of restarted threads are reconnected to the stack.