aivika-transformers-5.9: Transformers for the Aivika simulation library

CopyrightCopyright (c) 2009-2017 David Sorokin <david.sorokin@gmail.com>
LicenseBSD3
MaintainerDavid Sorokin <david.sorokin@gmail.com>
Stabilityexperimental
Safe HaskellNone
LanguageHaskell2010

Simulation.Aivika.Trans.Resource.Preemption

Description

Tested with: GHC 8.0.1

This module defines the preemptible resource.

Synopsis

Documentation

class MonadDES m => MonadResource m where Source #

A type class of monads whithin which we can create preemptible resources.

Associated Types

data Resource m Source #

Represents a preemptible resource.

Methods

newResource Source #

Arguments

:: Int

the initial count (and maximal count too) of the resource

-> Event m (Resource m) 

Create a new resource with the specified initial count that becomes the upper bound as well.

newResourceWithMaxCount Source #

Arguments

:: Int

the initial count of the resource

-> Maybe Int

the maximum count of the resource, which can be indefinite

-> Event m (Resource m) 

Create a new resource with the specified initial and maximum counts, where Nothing means that the resource has no upper bound.

resourceCount :: Resource m -> Event m Int Source #

Return the current count of the resource.

resourceMaxCount :: Resource m -> Maybe Int Source #

Return the maximum count of the resource, where Nothing means that the resource has no upper bound.

resourceCountStats :: Resource m -> Event m (TimingStats Int) Source #

Return the statistics for the available count of the resource.

resourceCountChanged :: Resource m -> Signal m Int Source #

Signal triggered when the resourceCount property changes.

resourceCountChanged_ :: Resource m -> Signal m () Source #

Signal triggered when the resourceCount property changes.

resourceUtilisationCount :: Resource m -> Event m Int Source #

Return the current utilisation count of the resource.

resourceUtilisationCountStats :: Resource m -> Event m (TimingStats Int) Source #

Return the statistics for the utilisation count of the resource.

resourceUtilisationCountChanged :: Resource m -> Signal m Int Source #

Signal triggered when the resourceUtilisationCount property changes.

resourceUtilisationCountChanged_ :: Resource m -> Signal m () Source #

Signal triggered when the resourceUtilisationCount property changes.

resourceQueueCount :: Resource m -> Event m Int Source #

Return the current queue length of the resource.

resourceQueueCountStats :: Resource m -> Event m (TimingStats Int) Source #

Return the statistics for the queue length of the resource.

resourceQueueCountChanged :: Resource m -> Signal m Int Source #

Signal triggered when the resourceQueueCount property changes.

resourceQueueCountChanged_ :: Resource m -> Signal m () Source #

Signal triggered when the resourceQueueCount property changes.

resourceTotalWaitTime :: Resource m -> Event m Double Source #

Return the total wait time of the resource.

resourceWaitTime :: Resource m -> Event m (SamplingStats Double) Source #

Return the statistics for the wait time of the resource.

resourceWaitTimeChanged :: Resource m -> Signal m (SamplingStats Double) Source #

Signal triggered when the resourceTotalWaitTime and resourceWaitTime properties change.

resourceWaitTimeChanged_ :: Resource m -> Signal m () Source #

Signal triggered when the resourceTotalWaitTime and resourceWaitTime properties change.

resourceChanged_ :: Resource m -> Signal m () Source #

Signal triggered when one of the resource counters changes.

requestResourceWithPriority Source #

Arguments

:: Resource m

the requested resource

-> Double

the priority (the less value has a higher priority)

-> Process m () 

Request with the priority for the resource decreasing its count in case of success, otherwise suspending the discontinuous process until some other process releases the resource.

It may preempt another process if the latter aquired the resource before but had a lower priority. Then the current process takes an ownership of the resource.

releaseResource Source #

Arguments

:: Resource m

the resource to release

-> Process m () 

Release the resource increasing its count and resuming one of the previously suspended or preempted processes as possible.

usingResourceWithPriority Source #

Arguments

:: Resource m

the resource we are going to request for and then release in the end

-> Double

the priority (the less value has a higher priority)

-> Process m a

the action we are going to apply having the resource

-> Process m a

the result of the action

Acquire the resource with the specified priority, perform some action and safely release the resource in the end, even if the IOException was raised within the action.

incResourceCount Source #

Arguments

:: Resource m

the resource

-> Int

the increment for the resource count

-> Event m () 

Increase the count of available resource by the specified number, invoking the awaiting and preempted processes according to their priorities as needed.

decResourceCount Source #

Arguments

:: Resource m

the resource

-> Int

the decrement for the resource count

-> Event m () 

Decrease the count of available resource by the specified number, preempting the processes according to their priorities as needed.

alterResourceCount Source #

Arguments

:: Resource m

the resource

-> Int

a change of the resource count

-> Event m () 

Alter the resource count either increasing or decreasing it by calling incResourceCount or decResourceCount respectively.

resetResource :: Resource m -> Event m () Source #

Reset the statistics.

Instances
MonadResource IO Source #

The IO monad is an instance of MonadResource.

Instance details

Defined in Simulation.Aivika.IO.Resource.Preemption

Associated Types

data Resource IO :: Type Source #

Methods

newResource :: Int -> Event IO (Resource IO) Source #

newResourceWithMaxCount :: Int -> Maybe Int -> Event IO (Resource IO) Source #

resourceCount :: Resource IO -> Event IO Int Source #

resourceMaxCount :: Resource IO -> Maybe Int Source #

resourceCountStats :: Resource IO -> Event IO (TimingStats Int) Source #

resourceCountChanged :: Resource IO -> Signal IO Int Source #

resourceCountChanged_ :: Resource IO -> Signal IO () Source #

resourceUtilisationCount :: Resource IO -> Event IO Int Source #

resourceUtilisationCountStats :: Resource IO -> Event IO (TimingStats Int) Source #

resourceUtilisationCountChanged :: Resource IO -> Signal IO Int Source #

resourceUtilisationCountChanged_ :: Resource IO -> Signal IO () Source #

resourceQueueCount :: Resource IO -> Event IO Int Source #

resourceQueueCountStats :: Resource IO -> Event IO (TimingStats Int) Source #

resourceQueueCountChanged :: Resource IO -> Signal IO Int Source #

resourceQueueCountChanged_ :: Resource IO -> Signal IO () Source #

resourceTotalWaitTime :: Resource IO -> Event IO Double Source #

resourceWaitTime :: Resource IO -> Event IO (SamplingStats Double) Source #

resourceWaitTimeChanged :: Resource IO -> Signal IO (SamplingStats Double) Source #

resourceWaitTimeChanged_ :: Resource IO -> Signal IO () Source #

resourceChanged_ :: Resource IO -> Signal IO () Source #

requestResourceWithPriority :: Resource IO -> Double -> Process IO () Source #

releaseResource :: Resource IO -> Process IO () Source #

usingResourceWithPriority :: Resource IO -> Double -> Process IO a -> Process IO a Source #

incResourceCount :: Resource IO -> Int -> Event IO () Source #

decResourceCount :: Resource IO -> Int -> Event IO () Source #

alterResourceCount :: Resource IO -> Int -> Event IO () Source #

resetResource :: Resource IO -> Event IO () Source #