On Sep 18, 2008, at 15:10 , Manlio Perillo wrote:
Allocation areas are per-CPU, not per-thread. A Concurrent Haskell
thread consists of a TSO (thread state object, currently 11 machine
words), and a stack, which we currently start with 1KB and grow on
demand.
How is this implemented?
I have seen some coroutine implementations in C, using functions
from ucontext.h (or direct asm code), but all have the problem that
the allocated stack is fixed.
That's because it's much easier to use a fixed stack.
There are two ways to handle a growable stack; both start with
allocating each stack in a separate part of the address space with
room to grow it downward. The simpler way uses stack probes on
function entry to detect impending stack overflow. The harder (and
less portable) one involves trapping page faults ("segmentation
violation" on POSIX), enlarging the stack, and restarting the
instruction that caused the trap; this requires fairly detailed
knowledge of the CPU and the way signals or page faults are handled by
the OS. (There's also a hybrid which many POSIXish systems use,
trapping the page fault specifically when running the stack probe; the
probe is designed to be safe to either restart or ignore, so it can be
handled more portably.)
--
brandon s. allbery [solaris,freebsd,perl,pugs,haskell] [EMAIL PROTECTED]
system administrator [openafs,heimdal,too many hats] [EMAIL PROTECTED]
electrical and computer engineering, carnegie mellon university KF8NH
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe