[GHC] #9377: forkProcess unnecessarily sets wait_foreign in hs_exit_
GHC
ghc-devs at haskell.org
Tue Jul 29 10:22:38 UTC 2014
#9377: forkProcess unnecessarily sets wait_foreign in hs_exit_
-------------------------------------+-------------------------------------
Reporter: edsko | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 7.8.3
Keywords: | Operating System:
Architecture: Unknown/Multiple | Unknown/Multiple
Difficulty: Unknown | Type of failure:
Blocked By: | None/Unknown
Related Tickets: | Test Case:
| Blocking:
| Differential Revisions: Phab:D99
-------------------------------------+-------------------------------------
During normal course of action in `real_main` a process is terminated with
a call to
{{{#!hs
shutdownHaskellAndExit(exit_status, 0 /* !fastExit */);
}}}
which is defined as
{{{#!hs
void shutdownHaskellAndExit(int n, int fastExit)
{
if (!fastExit) {
// even if hs_init_count > 1, we still want to shut down the RTS
// and exit immediately (see #5402)
hs_init_count = 1;
// we're about to exit(), no need to wait for foreign calls to
return.
hs_exit_(rtsFalse);
}
stg_exit(n);
}
}}}
However, when we call `forkProcess`, the child process does ''not''
terminate in this manner, but instead calls
{{{#!hs
hs_exit(); // clean up and exit
stg_exit(EXIT_SUCCESS);
}}}
instead, where `hs_exit` is defined as
{{{#!hs
void hs_exit(void)
{
hs_exit_(rtsTrue);
// be safe; this might be a DLL
}
}}}
Crucially, this means that, unlike the parent, the child process ''does''
wait for foreign calls to be terminated (it calls `hs_exit_` with
`rtsTrue` instead of `rtsFalse`).
I don't see a reason why the child process should terminate in a different
manner to the parent, so I propose to change this so that `forkProcess`
calls `shutdownHaskellAndExit`, just like `real_main` does.
Incidentally, this is the immediate cause for
https://ghc.haskell.org/trac/ghc/ticket/9284 , although the patch proposed
in this ticket is not sufficient to solve the problems with termination of
the I/O manager in the general case (but I will let Andreas explain that
in more detail :).
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/9377>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list