
How do you detect when a process runs out of stack? Do you calculate the max stack usage from the bytecode and check before you push a new stack frame?
That's pretty much exactly right. The maximum stack usage for each function is statically calculated by the compiler anyway, see FunObj at: http://haskell.org/haskellwiki/Yhc/RTS/hbc The runtime doesn't quite check every time it pushes a new stack frame (it pushes stack frames for lots of reasons, for example because it's about to GC) so it always ensures that all times it has enough stack space for one stack frame (they're not very big anyway). When the runtime performs an EVAL function it checks that there is enough stack space for two frames and the called function's maximum stack usage (one for the frame it's going to create and another as the "spare").
How do you deal with OS threads portably? I assume you use pthreads for *nix. Does windows know pthreads or did you create some thin wrapper over OS specific threading?
A wrapper over OS specific threading, the *nix implementation does indeed use pthreads, and Neil's going to write the windows one since I know nothing about it ;-) Cheers :-) Tom