dejafu-1.5.0.0: A library for unit-testing concurrent programs.

Copyright(c) 2016--2018 Michael Walker
LicenseMIT
MaintainerMichael Walker <mike@barrucadu.co.uk>
Stabilityexperimental
PortabilityExistentialQuantification, FlexibleContexts, RankNTypes
Safe HaskellNone
LanguageHaskell2010

Test.DejaFu.Conc.Internal.Threading

Contents

Description

Operations and types for threads. This module is NOT considered to form part of the public interface of this library.

Synopsis

Threads

type Threads n = Map ThreadId (Thread n) Source #

Threads are stored in a map index by ThreadId.

data Thread n Source #

All the state of a thread.

Constructors

Thread 

Fields

data BoundThread n Source #

The state of a bound thread.

Constructors

BoundThread 

Fields

mkthread :: Action n -> Thread n Source #

Construct a thread with just one action

Blocking

data BlockedOn Source #

A BlockedOn is used to determine what sort of variable a thread is blocked on.

Instances

(~=) :: Thread n -> BlockedOn -> Bool Source #

Determine if a thread is blocked in a certain way.

Exceptions

data Handler n Source #

An exception handler.

Constructors

Exception e => Handler (e -> MaskingState -> 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!

block :: HasCallStack => BlockedOn -> ThreadId -> Threads n -> Threads n Source #

Block a thread.

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 TVars.

Bound threads

makeBound :: (MonadConc n, HasCallStack) => ThreadId -> Threads n -> n (Threads n) Source #

Turn a thread into a bound thread.

kill :: (MonadConc 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 :: MonadConc 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.