The Eden implementation exposes coordination control and communication to Haskell level, and uses the defined primitives in the internals of a module
(this part is not relevant for the GpH variant, but might be interesting even though).
- runtime information primitives:
- placeholder creation and registration:
- connecting a thread to a registered inport:
- sending graph structures:
sendData#(also implementing remote process creation by a special send mode)
These primitives (see
rts/PrimOps.c) use the RTS functionality we have put in place earlier.
NB: if at all possible, we should make sure all primitives do something expectable and sensible in the non-parallel case. This is not true for
Simple operations like
selfPe / noPe only read variables inside the runtime system. They can be (and were) implemented as primitive operations, but the best way is to implement them in Haskell by simply reading a (foreign-import'ed) C Int (as done for Concurrent Haskell's
numCapabilities as well):
foreign import ccall "&nPEs" nPEs :: Ptr CInt foreign import ccall "&thisPE" thisPE :: Ptr CInt noPe,selfPe :: Int noPe = unsafePerformIO $ do n <- peek nPEs return (fromIntegral n) selfPe = unsafePerformIO $ do n <- peek thisPE return (fromIntegral n)