This page contains information about the design, implementation, problems and potential solutions for building user-level concurrency primitives in GHC.
All of GHC's concurrency primitives are written in C code and is baked in as a part of the RTS. This precludes extensibility as well as making it difficult to maintain. Ideally, the concurrency libraries will be implemented completely in Haskell code, over a small subset of primitive operations provided by the RTS. This will provide a Haskell programmer the ability to build custom schedulers and concurrency libraries. For an earlier attempt at this problem, please look at Peng Li's paper .
Substrate primitives are the primitives exposed by the RTS, on top of which user-level concurreny libraries are built.
data PTM a -- Primitive transactional memory instance Monad PTM unsafeIOToPTM :: IO a -> PTM a atomically :: PTM a -> IO a data PVar a -- Primitive transactional variable newPVar :: a -> PTM (PVar a) newPVarIO :: a -> IO (PVar a) readPVar :: PVar a -> PTM a writePVar :: PVar a -> a -> PTM () data SCont -- One-shot continuations data ThreadStatus = Blocked | Completed newSCont :: IO () -> IO SCont switch :: (SCont -> PTM (SCont, ThreadStatus)) -> IO () getSCont :: PTM SCont switchTo :: SCont -> ThreadStatus -> PTM ()