Copyright | Copyright (c) 2009-2016, David Sorokin <david.sorokin@gmail.com> |
---|---|
License | BSD3 |
Maintainer | David Sorokin <david.sorokin@gmail.com> |
Stability | experimental |
Safe Haskell | None |
Language | Haskell2010 |
Tested with: GHC 8.0.1
This module defines the preemptible resource.
The module is optimised in the sense that this kind of the resource has neither additional signals, nor counters that would may slow down the simulation.
- class MonadDES m => MonadResource m where
- data Resource m
Documentation
class MonadDES m => MonadResource m where Source #
A type class of monads whithin which we can create preemptible resources.
newResource, newResourceWithMaxCount, resourceCount, resourceMaxCount, requestResourceWithPriority, releaseResource, usingResourceWithPriority, incResourceCount, decResourceCount, alterResourceCount
newResource :: Int -> Simulation m (Resource m) Source #
Create a new resource with the specified initial count that becomes the upper bound as well.
newResourceWithMaxCount :: Int -> Maybe Int -> Simulation m (Resource m) Source #
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.
requestResourceWithPriority :: Resource m -> Double -> Process m () Source #
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 :: Resource m -> Process m () Source #
Release the resource increasing its count and resuming one of the previously suspended or preempted processes as possible.
usingResourceWithPriority :: Resource m -> Double -> Process m a -> Process m a Source #
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 :: Resource m -> Int -> Event m () Source #
Increase the count of available resource by the specified number, invoking the awaiting and preempted processes according to their priorities as needed.
decResourceCount :: Resource m -> Int -> Event m () Source #
Decrease the count of available resource by the specified number, preempting the processes according to their priorities as needed.
alterResourceCount :: Resource m -> Int -> Event m () Source #
Alter the resource count either increasing or decreasing it by calling
incResourceCount
or decResourceCount
respectively.