module Ecluse.Runtime.Server.Drain (
DrainSignal,
newDrainSignal,
neverDraining,
beginDrain,
isDraining,
ShutdownDrainTimeout (..),
defaultShutdownDrainTimeout,
) where
data DrainSignal = DrainSignal
{ DrainSignal -> STM Bool
drainState :: STM Bool
, DrainSignal -> STM ()
drainRaise :: STM ()
}
newDrainSignal :: IO DrainSignal
newDrainSignal :: IO DrainSignal
newDrainSignal = do
tvar <- Bool -> IO (TVar Bool)
forall (m :: * -> *) a. MonadIO m => a -> m (TVar a)
newTVarIO Bool
False
pure
DrainSignal
{ drainState = readTVar tvar
, drainRaise = writeTVar tvar True
}
neverDraining :: DrainSignal
neverDraining :: DrainSignal
neverDraining =
DrainSignal
{ drainState :: STM Bool
drainState = Bool -> STM Bool
forall a. a -> STM a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
False
, drainRaise :: STM ()
drainRaise = () -> STM ()
forall a. a -> STM a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
}
beginDrain :: DrainSignal -> IO ()
beginDrain :: DrainSignal -> IO ()
beginDrain = STM () -> IO ()
forall (m :: * -> *) a. MonadIO m => STM a -> m a
atomically (STM () -> IO ())
-> (DrainSignal -> STM ()) -> DrainSignal -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DrainSignal -> STM ()
drainRaise
isDraining :: DrainSignal -> IO Bool
isDraining :: DrainSignal -> IO Bool
isDraining = STM Bool -> IO Bool
forall (m :: * -> *) a. MonadIO m => STM a -> m a
atomically (STM Bool -> IO Bool)
-> (DrainSignal -> STM Bool) -> DrainSignal -> IO Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DrainSignal -> STM Bool
drainState
newtype ShutdownDrainTimeout = ShutdownDrainTimeout Int
deriving stock (ShutdownDrainTimeout -> ShutdownDrainTimeout -> Bool
(ShutdownDrainTimeout -> ShutdownDrainTimeout -> Bool)
-> (ShutdownDrainTimeout -> ShutdownDrainTimeout -> Bool)
-> Eq ShutdownDrainTimeout
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ShutdownDrainTimeout -> ShutdownDrainTimeout -> Bool
== :: ShutdownDrainTimeout -> ShutdownDrainTimeout -> Bool
$c/= :: ShutdownDrainTimeout -> ShutdownDrainTimeout -> Bool
/= :: ShutdownDrainTimeout -> ShutdownDrainTimeout -> Bool
Eq, Int -> ShutdownDrainTimeout -> ShowS
[ShutdownDrainTimeout] -> ShowS
ShutdownDrainTimeout -> String
(Int -> ShutdownDrainTimeout -> ShowS)
-> (ShutdownDrainTimeout -> String)
-> ([ShutdownDrainTimeout] -> ShowS)
-> Show ShutdownDrainTimeout
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ShutdownDrainTimeout -> ShowS
showsPrec :: Int -> ShutdownDrainTimeout -> ShowS
$cshow :: ShutdownDrainTimeout -> String
show :: ShutdownDrainTimeout -> String
$cshowList :: [ShutdownDrainTimeout] -> ShowS
showList :: [ShutdownDrainTimeout] -> ShowS
Show)
defaultShutdownDrainTimeout :: ShutdownDrainTimeout
defaultShutdownDrainTimeout :: ShutdownDrainTimeout
defaultShutdownDrainTimeout = Int -> ShutdownDrainTimeout
ShutdownDrainTimeout Int
30