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

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

Test.DejaFu.Conc.Internal

Contents

Description

Concurrent monads with a fixed scheduler: internal types and functions. This module is NOT considered to form part of the public interface of this library.

Synopsis

Execution

type SeqTrace = Seq (Decision, [(ThreadId, Lookahead)], ThreadAction) Source #

Trace but as a sequence.

data CResult n r g a Source #

The result of running a concurrent program.

Constructors

CResult 

Fields

data DCSnapshot r n a Source #

A snapshot of the concurrency state immediately after dontCheck finishes.

Since: 1.1.0.0

Constructors

DCSnapshot 

Fields

runConcurrency :: (MonadConc n, MonadRef r n) => Bool -> Scheduler g -> MemType -> g -> IdSource -> Int -> M n r a -> n (CResult n r g a) Source #

Run a concurrent computation with a given Scheduler and initial state, returning a failure reason on error. Also returned is the final state of the scheduler, and an execution trace.

runConcurrencyWithSnapshot :: (MonadConc n, MonadRef r n) => Scheduler g -> MemType -> Context n r g -> (Threads n r -> n ()) -> r (Maybe (Either Failure a)) -> n (CResult n r g a) Source #

Like runConcurrency but starts from a snapshot.

killAllThreads :: MonadConc n => Context n r g -> n () Source #

Kill the remaining threads

runConcurrency' :: (MonadConc n, MonadRef r n) => Bool -> Scheduler g -> MemType -> Context n r g -> M n r a -> n (CResult n r g a) Source #

Run a concurrent program using the given context, and without killing threads which remain at the end. The context must have no main thread.

runConcurrency'' :: (MonadConc n, MonadRef r n) => Bool -> Scheduler g -> MemType -> r (Maybe (Either Failure a)) -> Context n r g -> n (CResult n r g a) Source #

Like runConcurrency' but doesn't do *ANY* set up at all.

data Context n r g Source #

The context a collection of threads are running in.

Constructors

Context 

runThreads :: (MonadConc n, MonadRef r n) => Bool -> Scheduler g -> MemType -> r (Maybe (Either Failure a)) -> Context n r g -> n (Context n r g, SeqTrace, Maybe (ThreadId, ThreadAction), Maybe (Threads n r -> n ())) Source #

Run a collection of threads, until there are no threads left.

Single-step execution

data Act Source #

What a thread did, for trace purposes.

Constructors

Single ThreadAction

Just one action.

SubC SeqTrace (Maybe (ThreadId, ThreadAction))

subconcurrency, with the given trace and final action.

Instances

Eq Act Source # 

Methods

(==) :: Act -> Act -> Bool #

(/=) :: Act -> Act -> Bool #

Show Act Source # 

Methods

showsPrec :: Int -> Act -> ShowS #

show :: Act -> String #

showList :: [Act] -> ShowS #

data What n r g Source #

What a thread did, for execution purposes.

Constructors

Succeeded (Context n r g)

Action succeeded: continue execution.

Failed Failure

Action caused computation to fail: stop.

Snap (Context n r g)

Action was a snapshot point and we're in snapshot mode: stop.

stepThread Source #

Arguments

:: (MonadConc n, MonadRef r n) 
=> Bool

Should we record a snapshot?

-> Bool

Is this the first action?

-> Scheduler g

The scheduler.

-> MemType

The memory model to use.

-> ThreadId

ID of the current thread

-> Action n r

Action to step

-> Context n r g

The execution context.

-> n (What n r g, Act, Threads n r -> n ()) 

Run a single thread one step, by dispatching on the type of Action.

Note: the returned snapshot action will definitely not do the right thing with relaxed memory.