module PrioritySync.PrioritySync
(Dispatch.TaskHandle,
Room.claim,
Dispatch.dispatch,
getResult,
tryGetResult,
Prioritized.Prioritized(),
reprioritize,
Constrained.Constrained(..),
Unconstrained.Unconstrained(..),
RoomConstraint.MaxThreads(..),
Room.Room,
Room.newRoom,
Room.userData,
Room.ClaimMode(..),
load,
Occupancy(..),
Queue.QueueConfigurationRecord(..),
Queue.fair_queue_configuration,
Queue.fast_queue_configuration,
Queue.QueueOrder(..),
TaskPool.TaskPool,
TaskPool.schedule,
TaskPool.newTaskPool,
TaskPool.simpleTaskPool,
startQueue,
stopQueue,
TaskPool.waitUntilFinished)
where
import qualified PrioritySync.Internal.Dispatch as Dispatch
import qualified PrioritySync.Internal.Prioritized as Prioritized
import qualified PrioritySync.Internal.Room as Room
import qualified PrioritySync.Internal.RoomConstraint as RoomConstraint
import qualified PrioritySync.Internal.Queue as Queue
import qualified PrioritySync.Internal.TaskPool as TaskPool
import qualified PrioritySync.Internal.Constrained as Constrained
import qualified PrioritySync.Internal.Unconstrained as Unconstrained
import Data.Set as Set
import Control.Concurrent.STM
import Control.Concurrent
import Control.Monad
getResult :: Dispatch.TaskHandle p a -> IO a
getResult task = atomically $ Dispatch.getResult task
tryGetResult :: Dispatch.TaskHandle p a -> IO (Maybe a)
tryGetResult task = atomically $ Dispatch.tryGetResult task
reprioritize :: Dispatch.TaskHandle p a -> (p -> p) -> IO ()
reprioritize task f = atomically $ Prioritized.reprioritize task f
load :: (Ord p) => TaskPool.TaskPool p u -> IO Int
load = atomically . Queue.load . TaskPool.poolQueue
class Occupancy o where
inUse :: o -> IO (Set ThreadId)
isEmpty :: o -> IO Bool
isEmpty = liftM Set.null . inUse
instance (Ord p) => Occupancy (TaskPool.TaskPool p u) where
inUse pool = atomically $ Room.inUse $ TaskPool.poolRoom pool
isEmpty pool = atomically $ TaskPool.isEmpty pool
instance Occupancy (Room.Room u) where
inUse = atomically . Room.inUse
isEmpty = atomically . Room.isEmpty
startQueue :: TaskPool.TaskPool p a -> IO ()
startQueue = atomically . TaskPool.startQueue
stopQueue :: TaskPool.TaskPool p a -> IO ()
stopQueue = atomically . TaskPool.stopQueue