module Network.HTTP2.H2.Queue where
import Control.Concurrent.STM
import Network.HTTP2.H2.Types
{-# INLINE enqueueOutput #-}
enqueueOutput :: TQueue Output -> Output -> IO ()
enqueueOutput :: TQueue Output -> Output -> IO ()
enqueueOutput TQueue Output
outQ Output
out = STM () -> IO ()
forall a. STM a -> IO a
atomically (STM () -> IO ()) -> STM () -> IO ()
forall a b. (a -> b) -> a -> b
$ TQueue Output -> Output -> STM ()
forall a. TQueue a -> a -> STM ()
writeTQueue TQueue Output
outQ Output
out
{-# INLINE enqueueOutputSTM #-}
enqueueOutputSTM :: TQueue Output -> Output -> STM ()
enqueueOutputSTM :: TQueue Output -> Output -> STM ()
enqueueOutputSTM TQueue Output
outQ Output
out = TQueue Output -> Output -> STM ()
forall a. TQueue a -> a -> STM ()
writeTQueue TQueue Output
outQ Output
out
newControlQ :: IO ControlQ
newControlQ :: IO ControlQ
newControlQ = TQueue Control -> TVar Int -> ControlQ
ControlQ (TQueue Control -> TVar Int -> ControlQ)
-> IO (TQueue Control) -> IO (TVar Int -> ControlQ)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO (TQueue Control)
forall a. IO (TQueue a)
newTQueueIO IO (TVar Int -> ControlQ) -> IO (TVar Int) -> IO ControlQ
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Int -> IO (TVar Int)
forall a. a -> IO (TVar a)
newTVarIO Int
0
{-# INLINE enqueueControl #-}
enqueueControl :: ControlQ -> Control -> IO ()
enqueueControl :: ControlQ -> Control -> IO ()
enqueueControl (ControlQ TQueue Control
q TVar Int
n) Control
ctl = STM () -> IO ()
forall a. STM a -> IO a
atomically (STM () -> IO ()) -> STM () -> IO ()
forall a b. (a -> b) -> a -> b
$ do
TQueue Control -> Control -> STM ()
forall a. TQueue a -> a -> STM ()
writeTQueue TQueue Control
q Control
ctl
TVar Int -> (Int -> Int) -> STM ()
forall a. TVar a -> (a -> a) -> STM ()
modifyTVar' TVar Int
n (Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
dequeueControlSTM :: ControlQ -> STM Control
dequeueControlSTM :: ControlQ -> STM Control
dequeueControlSTM (ControlQ TQueue Control
q TVar Int
n) = do
Control
ctl <- TQueue Control -> STM Control
forall a. TQueue a -> STM a
readTQueue TQueue Control
q
TVar Int -> (Int -> Int) -> STM ()
forall a. TVar a -> (a -> a) -> STM ()
modifyTVar' TVar Int
n (Int -> Int -> Int
forall a. Num a => a -> a -> a
subtract Int
1)
Control -> STM Control
forall a. a -> STM a
forall (m :: * -> *) a. Monad m => a -> m a
return Control
ctl
isEmptyControlQ :: ControlQ -> STM Bool
isEmptyControlQ :: ControlQ -> STM Bool
isEmptyControlQ (ControlQ TQueue Control
q TVar Int
_) = TQueue Control -> STM Bool
forall a. TQueue a -> STM Bool
isEmptyTQueue TQueue Control
q
waitControlQ :: ControlQ -> STM ()
waitControlQ :: ControlQ -> STM ()
waitControlQ (ControlQ TQueue Control
_ TVar Int
n) = do
Int
len <- TVar Int -> STM Int
forall a. TVar a -> STM a
readTVar TVar Int
n
Bool -> STM ()
check (Int
len Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
controlQLimit)
controlQLimit :: Int
controlQLimit :: Int
controlQLimit = Int
1000