Difference between revisions of "Lightweight concurrency"
(Adding substrate primitives) |
(Added primitives) |
||
Line 10: | Line 10: | ||
<haskell> |
<haskell> |
||
+ | 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 () |
||
</haskell> |
</haskell> |
Revision as of 11:49, 7 March 2012
This page contains information about the design, implementation, problems and potential solutions for building user-level concurrency primitives in GHC.
Introdution
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 [1].
Substrate primitives
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 ()