Difference between revisions of "Lightweight concurrency"

From HaskellWiki
Jump to: navigation, search
(Added primitives)
(Substrate primitives: added comment)
Line 22: Line 22:
   
 
data SCont -- One-shot continuations
 
data SCont -- One-shot continuations
data ThreadStatus = Blocked | Completed
+
data ThreadStatus = Blocked | Completed -- | Running. Running is set implicitly.
 
newSCont :: IO () -> IO SCont
 
newSCont :: IO () -> IO SCont
 
switch :: (SCont -> PTM (SCont, ThreadStatus)) -> IO ()
 
switch :: (SCont -> PTM (SCont, ThreadStatus)) -> IO ()
  +
{- For switch, target thread's status must be Blocked. Otherwise, raises runtime error.
  +
- After switching, target thread's status is implicitly set to Running, and current
  +
- thread's status is set to ThreadStatus that was passed.
  +
-}
 
getSCont :: PTM SCont
 
getSCont :: PTM SCont
 
switchTo :: SCont -> ThreadStatus -> PTM ()
 
switchTo :: SCont -> ThreadStatus -> PTM ()

Revision as of 12:13, 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 -- | Running. Running is set implicitly.
newSCont :: IO () -> IO SCont
switch   :: (SCont -> PTM (SCont, ThreadStatus)) -> IO ()
{- For switch, target thread's status must be Blocked. Otherwise, raises runtime error. 
 - After switching, target thread's status is implicitly set to Running, and current 
 - thread's status is set to ThreadStatus that was passed.
 -}
getSCont :: PTM SCont
switchTo :: SCont -> ThreadStatus -> PTM ()