Copyright | (c) 2016--2020 Michael Walker |
---|---|
License | MIT |
Maintainer | Michael Walker <mike@barrucadu.co.uk> |
Stability | experimental |
Portability | ExistentialQuantification, FlexibleContexts, RankNTypes |
Safe Haskell | Safe-Inferred |
Language | Haskell2010 |
Operations and types for threads. This module is NOT considered to form part of the public interface of this library.
Synopsis
- type Threads n = Map ThreadId (Thread n)
- data Thread n = Thread {
- _continuation :: Action n
- _blocking :: Maybe BlockedOn
- _handlers :: [Handler n]
- _masking :: MaskingState
- _bound :: Maybe (BoundThread n (Action n))
- mkthread :: Action n -> Thread n
- data BlockedOn
- (~=) :: Thread n -> BlockedOn -> Bool
- data Handler n = forall e.Exception e => Handler MaskingState (e -> Action n)
- propagate :: HasCallStack => SomeException -> ThreadId -> Threads n -> Maybe (Threads n)
- interruptible :: Thread n -> Bool
- catching :: (Exception e, HasCallStack) => (e -> Action n) -> ThreadId -> Threads n -> Threads n
- uncatching :: HasCallStack => ThreadId -> Threads n -> Threads n
- except :: HasCallStack => MaskingState -> Action n -> [Handler n] -> ThreadId -> Threads n -> Threads n
- mask :: HasCallStack => MaskingState -> ThreadId -> Threads n -> Threads n
- goto :: HasCallStack => Action n -> ThreadId -> Threads n -> Threads n
- launch :: HasCallStack => ThreadId -> ThreadId -> ((forall b. ModelConc n b -> ModelConc n b) -> Action n) -> Threads n -> Threads n
- launch' :: HasCallStack => MaskingState -> ThreadId -> ((forall b. ModelConc n b -> ModelConc n b) -> Action n) -> Threads n -> Threads n
- block :: HasCallStack => BlockedOn -> ThreadId -> Threads n -> Threads n
- wake :: BlockedOn -> Threads n -> (Threads n, [ThreadId])
- makeBound :: (MonadDejaFu n, HasCallStack) => n (BoundThread n (Action n)) -> ThreadId -> Threads n -> n (Threads n)
- kill :: (MonadDejaFu n, HasCallStack) => ThreadId -> Threads n -> n (Threads n)
- runLiftedAct :: MonadDejaFu n => ThreadId -> Threads n -> n (Action n) -> n (Action n)
Threads
All the state of a thread.
Thread | |
|
Blocking
A BlockedOn
is used to determine what sort of variable a thread
is blocked on.
Exceptions
An exception handler.
forall e.Exception e => Handler MaskingState (e -> Action n) |
propagate :: HasCallStack => SomeException -> ThreadId -> Threads n -> Maybe (Threads n) Source #
Propagate an exception upwards, finding the closest handler which can deal with it.
interruptible :: Thread n -> Bool Source #
Check if a thread can be interrupted by an exception.
catching :: (Exception e, HasCallStack) => (e -> Action n) -> ThreadId -> Threads n -> Threads n Source #
Register a new exception handler.
uncatching :: HasCallStack => ThreadId -> Threads n -> Threads n Source #
Remove the most recent exception handler.
except :: HasCallStack => MaskingState -> Action n -> [Handler n] -> ThreadId -> Threads n -> Threads n Source #
Raise an exception in a thread.
mask :: HasCallStack => MaskingState -> ThreadId -> Threads n -> Threads n Source #
Set the masking state of a thread.
Manipulating threads
goto :: HasCallStack => Action n -> ThreadId -> Threads n -> Threads n Source #
Replace the Action
of a thread.
launch :: HasCallStack => ThreadId -> ThreadId -> ((forall b. ModelConc n b -> ModelConc n b) -> Action n) -> Threads n -> Threads n Source #
Start a thread with the given ID, inheriting the masking state from the parent thread. This ID must not already be in use!
launch' :: HasCallStack => MaskingState -> ThreadId -> ((forall b. ModelConc n b -> ModelConc n b) -> Action n) -> Threads n -> Threads n Source #
Start a thread with the given ID and masking state. This must not already be in use!
wake :: BlockedOn -> Threads n -> (Threads n, [ThreadId]) Source #
Unblock all threads waiting on the appropriate block. For TVar
blocks, this will wake all threads waiting on at least one of the
given TVar
s.
Bound threads
makeBound :: (MonadDejaFu n, HasCallStack) => n (BoundThread n (Action n)) -> ThreadId -> Threads n -> n (Threads n) Source #
Turn a thread into a bound thread.
kill :: (MonadDejaFu n, HasCallStack) => ThreadId -> Threads n -> n (Threads n) Source #
Kill a thread and remove it from the thread map.
If the thread is bound, the worker thread is cleaned up.
runLiftedAct :: MonadDejaFu n => ThreadId -> Threads n -> n (Action n) -> n (Action n) Source #
Run an action.
If the thread is bound, the action is run in the worker thread.