{-# LANGUAGE RecordWildCards #-}
{-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}

module Network.QPACK.Table.Dynamic (
    -- * Dynamic table
    DynamicTable,
    newDynamicTableForEncoding,
    newDynamicTableForDecoding,

    -- * Capacity
    isTableReady,
    getTableCapacity,
    setTableCapacity,
    getMaxNumOfEntries,

    -- * Entry
    insertEntryToDecoder,
    insertEntryToEncoder,
    toDynamicEntry,

    -- * Section
    Section (..),
    insertSection,
    getAndDelSection,
    increaseReference,
    decreaseReference,

    -- * Streams
    getMaxBlockedStreams,
    setMaxBlockedStreams,
    tryIncreaseStreams,
    decreaseStreams,

    -- * Blocked streams
    insertBlockedStreamE,
    deleteBlockedStreamE,
    checkBlockedStreams,

    -- * Required insert count
    getRequiredInsertCount,
    clearRequiredInsertCount,
    checkRequiredInsertCount,
    checkRequiredInsertCountNB,
    updateRequiredInsertCount,

    -- * Known received count
    incrementKnownReceivedCount,
    updateKnownReceivedCount,
    wouldSectionBeBlocked,
    wouldInstructionBeBlocked,
    setInsersionPointToKnownReceivedCount,

    -- * Points
    getBasePoint,
    setBasePointToInsersionPoint,
    getInsertionPoint,
    getInsertionPointSTM,

    -- * Draining
    isDraining,
    adjustDrainingPoint,
    checkTailDuplication,
    tailDuplication,
    duplicate,
    tryDrop,

    -- * Dropping
    canInsertEntry,

    -- * Accessing
    getLruCache,
    getRevIndex,
    getHuffmanDecoder,
    sendIns,

    -- * Max header size
    getMaxHeaderSize,
    setMaxHeaderSize,

    -- * Debug
    qpackDebug,
    getDebugQPACK,
    setDebugQPACK,
    printReferences,
    checkHIndex,
    checkAbsoluteIndex,

    -- * QIF
    getImmediateAck,
    setImmediateAck,
) where

import Control.Concurrent
import Control.Concurrent.STM
import Data.Array.Base (unsafeRead, unsafeWrite)
import Data.Array.IO (IOArray, newArray)
import Data.IORef
import Data.IntMap.Strict (IntMap)
import qualified Data.IntMap.Strict as IntMap
import Data.Set (Set)
import qualified Data.Set as Set -- Set.size is O(1), IntSet.size is O(n)
import Imports
import Network.Control
import Network.HPACK.Internal (
    Entry,
    HuffmanDecoder,
    Index,
    Size,
    decodeH,
    dummyEntry,
    entryFieldValue,
    entryHeaderName,
    entrySize,
    maxNumbers,
 )
import System.IO.Unsafe (unsafePerformIO)

import Network.QPACK.Table.RevIndex
import Network.QPACK.Types
import Network.QUIC (StreamId)

----------------------------------------------------------------

type Table = TArray Index Entry
data Section = Section RequiredInsertCount [AbsoluteIndex]
data Reference = Reference Int Int deriving (Int -> Reference -> ShowS
[Reference] -> ShowS
Reference -> String
(Int -> Reference -> ShowS)
-> (Reference -> String)
-> ([Reference] -> ShowS)
-> Show Reference
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Reference -> ShowS
showsPrec :: Int -> Reference -> ShowS
$cshow :: Reference -> String
show :: Reference -> String
$cshowList :: [Reference] -> ShowS
showList :: [Reference] -> ShowS
Show)

{- FOURMOLU_DISABLE -}
data CodeInfo
    = EncodeInfo
        { CodeInfo -> RevIndex
revIndex            :: RevIndex -- Reverse index
        , CodeInfo -> IORef RequiredInsertCount
requiredInsertCount :: IORef RequiredInsertCount
        , CodeInfo -> IORef AbsoluteIndex
droppingPoint       :: IORef AbsoluteIndex
        , CodeInfo -> IORef AbsoluteIndex
drainingPoint       :: IORef AbsoluteIndex
        , CodeInfo -> TVar Int
knownReceivedCount  :: TVar Int
        , CodeInfo -> IORef (IOArray Int Reference)
referenceCounters   :: IORef (IOArray Index Reference)
        , CodeInfo -> IORef (IntMap Section)
sections            :: IORef (IntMap Section)
        , CodeInfo -> LRUCacheRef (FieldValue, FieldValue) ()
lruCache            :: LRUCacheRef (FieldName, FieldValue) ()
        , CodeInfo -> IORef Bool
immediateAck        :: IORef Bool -- for QIF
        , CodeInfo -> IORef (Set Int)
blockedStreamsE     :: IORef (Set Int)
        }
    | DecodeInfo
        { CodeInfo -> HuffmanDecoder
huffmanDecoder  :: HuffmanDecoder  -- only for encoder instruction handler
        , CodeInfo -> IORef Int
blockedStreamsD :: IORef Int
        }
{- FOURMOLU_ENABLE -}

-- | Dynamic table for QPACK.
{- FOURMOLU_DISABLE -}
data DynamicTable = DynamicTable
    { DynamicTable -> CodeInfo
codeInfo          :: CodeInfo
    , DynamicTable -> TVar InsertionPoint
insertionPoint    :: TVar InsertionPoint
    , DynamicTable -> TVar Int
maxNumOfEntries   :: TVar Int
    , DynamicTable -> TVar Table
circularTable     :: TVar Table
    , DynamicTable -> IORef BasePoint
basePoint         :: IORef BasePoint
    , DynamicTable -> IORef Bool
debugQPACK        :: IORef Bool
    , DynamicTable -> IORef Bool
capaReady         :: IORef Bool
    , DynamicTable -> TVar Int
tableSize         :: TVar Size
    , DynamicTable -> IORef Int
maxTableSize      :: IORef Size
    , DynamicTable -> FieldValue -> IO ()
sendIns           :: ByteString -> IO ()
    , DynamicTable -> IORef Int
maxHeaderSize     :: IORef Int
    , DynamicTable -> IORef Int
maxBlockedStreams :: IORef Int
    }
{- FOURMOLU_ENABLE -}

----------------------------------------------------------------

{- FOURMOLU_DISABLE -}
-- | Creating 'DynamicTable' for encoding.
newDynamicTableForEncoding
    :: (ByteString -> IO ())
    -> IO DynamicTable
newDynamicTableForEncoding :: (FieldValue -> IO ()) -> IO DynamicTable
newDynamicTableForEncoding FieldValue -> IO ()
sendEI = do
    IOArray Int Reference
arr <- (Int, Int) -> Reference -> IO (IOArray Int Reference)
forall i. Ix i => (i, i) -> Reference -> IO (IOArray i Reference)
forall (a :: * -> * -> *) e (m :: * -> *) i.
(MArray a e m, Ix i) =>
(i, i) -> e -> m (a i e)
newArray (Int
0, Int
0) (Reference -> IO (IOArray Int Reference))
-> Reference -> IO (IOArray Int Reference)
forall a b. (a -> b) -> a -> b
$ Int -> Int -> Reference
Reference Int
0 Int
0
    CodeInfo
info <- do
        RevIndex
revIndex            <- IO RevIndex
newRevIndex
        IORef RequiredInsertCount
requiredInsertCount <- RequiredInsertCount -> IO (IORef RequiredInsertCount)
forall a. a -> IO (IORef a)
newIORef RequiredInsertCount
0
        IORef AbsoluteIndex
droppingPoint       <- AbsoluteIndex -> IO (IORef AbsoluteIndex)
forall a. a -> IO (IORef a)
newIORef AbsoluteIndex
0
        IORef AbsoluteIndex
drainingPoint       <- AbsoluteIndex -> IO (IORef AbsoluteIndex)
forall a. a -> IO (IORef a)
newIORef AbsoluteIndex
0
        TVar Int
knownReceivedCount  <- Int -> IO (TVar Int)
forall a. a -> IO (TVar a)
newTVarIO Int
0
        IORef (IOArray Int Reference)
referenceCounters   <- IOArray Int Reference -> IO (IORef (IOArray Int Reference))
forall a. a -> IO (IORef a)
newIORef IOArray Int Reference
arr
        IORef (IntMap Section)
sections            <- IntMap Section -> IO (IORef (IntMap Section))
forall a. a -> IO (IORef a)
newIORef IntMap Section
forall a. IntMap a
IntMap.empty
        LRUCacheRef (FieldValue, FieldValue) ()
lruCache            <- Int -> IO (LRUCacheRef (FieldValue, FieldValue) ())
forall k v. Int -> IO (LRUCacheRef k v)
newLRUCacheRef Int
0
        IORef Bool
immediateAck        <- Bool -> IO (IORef Bool)
forall a. a -> IO (IORef a)
newIORef Bool
False
        IORef (Set Int)
blockedStreamsE     <- Set Int -> IO (IORef (Set Int))
forall a. a -> IO (IORef a)
newIORef Set Int
forall a. Set a
Set.empty
        CodeInfo -> IO CodeInfo
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return EncodeInfo{TVar Int
IORef Bool
IORef (IOArray Int Reference)
IORef (Set Int)
IORef (IntMap Section)
IORef RequiredInsertCount
IORef AbsoluteIndex
LRUCacheRef (FieldValue, FieldValue) ()
RevIndex
revIndex :: RevIndex
requiredInsertCount :: IORef RequiredInsertCount
droppingPoint :: IORef AbsoluteIndex
drainingPoint :: IORef AbsoluteIndex
knownReceivedCount :: TVar Int
referenceCounters :: IORef (IOArray Int Reference)
sections :: IORef (IntMap Section)
lruCache :: LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: IORef Bool
blockedStreamsE :: IORef (Set Int)
revIndex :: RevIndex
requiredInsertCount :: IORef RequiredInsertCount
droppingPoint :: IORef AbsoluteIndex
drainingPoint :: IORef AbsoluteIndex
knownReceivedCount :: TVar Int
referenceCounters :: IORef (IOArray Int Reference)
sections :: IORef (IntMap Section)
lruCache :: LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: IORef Bool
blockedStreamsE :: IORef (Set Int)
..}
    CodeInfo -> (FieldValue -> IO ()) -> IO DynamicTable
newDynamicTable CodeInfo
info FieldValue -> IO ()
sendEI
{- FOURMOLU_ENABLE -}

-- | Creating 'DynamicTable' for decoding.
newDynamicTableForDecoding
    :: Size
    -- ^ The size of temporary buffer for Huffman decoding
    -> (ByteString -> IO ())
    -> IO DynamicTable
newDynamicTableForDecoding :: Int -> (FieldValue -> IO ()) -> IO DynamicTable
newDynamicTableForDecoding Int
huftmpsiz FieldValue -> IO ()
sendDI = do
    ForeignPtr Word8
gcbuf <- Int -> IO (ForeignPtr Word8)
forall a. Int -> IO (ForeignPtr a)
mallocPlainForeignPtrBytes Int
huftmpsiz
    let huffmanDecoder :: HuffmanDecoder
huffmanDecoder = ForeignPtr Word8 -> Int -> HuffmanDecoder
decodeH ForeignPtr Word8
gcbuf Int
huftmpsiz
    IORef Int
blockedStreamsD <- Int -> IO (IORef Int)
forall a. a -> IO (IORef a)
newIORef Int
0
    CodeInfo -> (FieldValue -> IO ()) -> IO DynamicTable
newDynamicTable DecodeInfo{IORef Int
HuffmanDecoder
huffmanDecoder :: HuffmanDecoder
blockedStreamsD :: IORef Int
huffmanDecoder :: HuffmanDecoder
blockedStreamsD :: IORef Int
..} FieldValue -> IO ()
sendDI

newDynamicTable :: CodeInfo -> (ByteString -> IO ()) -> IO DynamicTable
newDynamicTable :: CodeInfo -> (FieldValue -> IO ()) -> IO DynamicTable
newDynamicTable CodeInfo
info FieldValue -> IO ()
send = do
    Table
tbl <- STM Table -> IO Table
forall a. STM a -> IO a
atomically (STM Table -> IO Table) -> STM Table -> IO Table
forall a b. (a -> b) -> a -> b
$ (Int, Int) -> Entry -> STM Table
forall i. Ix i => (i, i) -> Entry -> STM (TArray i Entry)
forall (a :: * -> * -> *) e (m :: * -> *) i.
(MArray a e m, Ix i) =>
(i, i) -> e -> m (a i e)
newArray (Int
0, Int
0) Entry
dummyEntry
    let codeInfo :: CodeInfo
codeInfo = CodeInfo
info
    TVar InsertionPoint
insertionPoint <- InsertionPoint -> IO (TVar InsertionPoint)
forall a. a -> IO (TVar a)
newTVarIO InsertionPoint
0
    TVar Int
maxNumOfEntries <- Int -> IO (TVar Int)
forall a. a -> IO (TVar a)
newTVarIO Int
0
    TVar Table
circularTable <- Table -> IO (TVar Table)
forall a. a -> IO (TVar a)
newTVarIO Table
tbl
    IORef BasePoint
basePoint <- BasePoint -> IO (IORef BasePoint)
forall a. a -> IO (IORef a)
newIORef BasePoint
0
    IORef Bool
debugQPACK <- Bool -> IO (IORef Bool)
forall a. a -> IO (IORef a)
newIORef Bool
False
    IORef Bool
capaReady <- Bool -> IO (IORef Bool)
forall a. a -> IO (IORef a)
newIORef Bool
False
    TVar Int
tableSize <- Int -> IO (TVar Int)
forall a. a -> IO (TVar a)
newTVarIO Int
0
    IORef Int
maxTableSize <- Int -> IO (IORef Int)
forall a. a -> IO (IORef a)
newIORef Int
0
    let sendIns :: FieldValue -> IO ()
sendIns = FieldValue -> IO ()
send
    IORef Int
maxHeaderSize <- Int -> IO (IORef Int)
forall a. a -> IO (IORef a)
newIORef Int
forall a. Bounded a => a
maxBound
    IORef Int
maxBlockedStreams <- Int -> IO (IORef Int)
forall a. a -> IO (IORef a)
newIORef Int
0
    DynamicTable -> IO DynamicTable
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: FieldValue -> IO ()
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..}

----------------------------------------------------------------

isTableReady :: DynamicTable -> IO Bool
isTableReady :: DynamicTable -> IO Bool
isTableReady DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} = IORef Bool -> IO Bool
forall a. IORef a -> IO a
readIORef IORef Bool
capaReady

getTableCapacity :: DynamicTable -> IO Int
getTableCapacity :: DynamicTable -> IO Int
getTableCapacity DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} = TVar Int -> IO Int
forall a. TVar a -> IO a
readTVarIO TVar Int
tableSize

setTableCapacity :: DynamicTable -> Int -> IO ()
setTableCapacity :: DynamicTable -> Int -> IO ()
setTableCapacity dyntbl :: DynamicTable
dyntbl@DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} Int
maxsiz = do
    DynamicTable -> IO () -> IO ()
qpackDebug DynamicTable
dyntbl (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$ String -> IO ()
putStrLn (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"setTableCapacity " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
maxsiz
    Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Int
maxN Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
1) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$ do
        IORef Int -> Int -> IO ()
forall a. IORef a -> a -> IO ()
writeIORef IORef Int
maxTableSize Int
maxsiz
        Table
tbl <- STM Table -> IO Table
forall a. STM a -> IO a
atomically (STM Table -> IO Table) -> STM Table -> IO Table
forall a b. (a -> b) -> a -> b
$ (Int, Int) -> Entry -> STM Table
forall i. Ix i => (i, i) -> Entry -> STM (TArray i Entry)
forall (a :: * -> * -> *) e (m :: * -> *) i.
(MArray a e m, Ix i) =>
(i, i) -> e -> m (a i e)
newArray (Int
0, Int
end) Entry
dummyEntry
        STM () -> IO ()
forall a. STM a -> IO a
atomically (STM () -> IO ()) -> STM () -> IO ()
forall a b. (a -> b) -> a -> b
$ do
            TVar Int -> Int -> STM ()
forall a. TVar a -> a -> STM ()
writeTVar TVar Int
maxNumOfEntries Int
maxN
            TVar Table -> Table -> STM ()
forall a. TVar a -> a -> STM ()
writeTVar TVar Table
circularTable Table
tbl
        case CodeInfo
codeInfo of
            EncodeInfo{TVar Int
IORef Bool
IORef (IOArray Int Reference)
IORef (Set Int)
IORef (IntMap Section)
IORef RequiredInsertCount
IORef AbsoluteIndex
LRUCacheRef (FieldValue, FieldValue) ()
RevIndex
revIndex :: CodeInfo -> RevIndex
requiredInsertCount :: CodeInfo -> IORef RequiredInsertCount
droppingPoint :: CodeInfo -> IORef AbsoluteIndex
drainingPoint :: CodeInfo -> IORef AbsoluteIndex
knownReceivedCount :: CodeInfo -> TVar Int
referenceCounters :: CodeInfo -> IORef (IOArray Int Reference)
sections :: CodeInfo -> IORef (IntMap Section)
lruCache :: CodeInfo -> LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: CodeInfo -> IORef Bool
blockedStreamsE :: CodeInfo -> IORef (Set Int)
revIndex :: RevIndex
requiredInsertCount :: IORef RequiredInsertCount
droppingPoint :: IORef AbsoluteIndex
drainingPoint :: IORef AbsoluteIndex
knownReceivedCount :: TVar Int
referenceCounters :: IORef (IOArray Int Reference)
sections :: IORef (IntMap Section)
lruCache :: LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: IORef Bool
blockedStreamsE :: IORef (Set Int)
..} -> do
                IOArray Int Reference
arr <- (Int, Int) -> Reference -> IO (IOArray Int Reference)
forall i. Ix i => (i, i) -> Reference -> IO (IOArray i Reference)
forall (a :: * -> * -> *) e (m :: * -> *) i.
(MArray a e m, Ix i) =>
(i, i) -> e -> m (a i e)
newArray (Int
0, Int
end) (Reference -> IO (IOArray Int Reference))
-> Reference -> IO (IOArray Int Reference)
forall a b. (a -> b) -> a -> b
$ Int -> Int -> Reference
Reference Int
0 Int
0
                IORef (IOArray Int Reference) -> IOArray Int Reference -> IO ()
forall a. IORef a -> a -> IO ()
writeIORef IORef (IOArray Int Reference)
referenceCounters IOArray Int Reference
arr
                LRUCacheRef (FieldValue, FieldValue) () -> Int -> IO ()
forall k v. LRUCacheRef k v -> Int -> IO ()
setLRUCapacity LRUCacheRef (FieldValue, FieldValue) ()
lruCache (Int
maxN Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
4)
            CodeInfo
_ -> () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
        IORef Bool -> Bool -> IO ()
forall a. IORef a -> a -> IO ()
writeIORef IORef Bool
capaReady Bool
True
  where
    maxN :: Int
maxN = Int -> Int
maxNumbers Int
maxsiz
    end :: Int
end = Int
maxN Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1

getMaxNumOfEntries :: DynamicTable -> IO Int
getMaxNumOfEntries :: DynamicTable -> IO Int
getMaxNumOfEntries DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} = TVar Int -> IO Int
forall a. TVar a -> IO a
readTVarIO TVar Int
maxNumOfEntries

----------------------------------------------------------------

insertEntryToEncoder :: Entry -> DynamicTable -> IO AbsoluteIndex
insertEntryToEncoder :: Entry -> DynamicTable -> IO AbsoluteIndex
insertEntryToEncoder Entry
ent dyntbl :: DynamicTable
dyntbl@DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} = do
    InsertionPoint Int
insp <- STM InsertionPoint -> IO InsertionPoint
forall a. STM a -> IO a
atomically (STM InsertionPoint -> IO InsertionPoint)
-> STM InsertionPoint -> IO InsertionPoint
forall a b. (a -> b) -> a -> b
$ do
        InsertionPoint
x <- TVar InsertionPoint -> STM InsertionPoint
forall a. TVar a -> STM a
readTVar TVar InsertionPoint
insertionPoint
        TVar InsertionPoint -> InsertionPoint -> STM ()
forall a. TVar a -> a -> STM ()
writeTVar TVar InsertionPoint
insertionPoint (InsertionPoint
x InsertionPoint -> InsertionPoint -> InsertionPoint
forall a. Num a => a -> a -> a
+ InsertionPoint
1)
        InsertionPoint -> STM InsertionPoint
forall a. a -> STM a
forall (m :: * -> *) a. Monad m => a -> m a
return InsertionPoint
x
    Int
maxN <- TVar Int -> IO Int
forall a. TVar a -> IO a
readTVarIO TVar Int
maxNumOfEntries
    let i :: Int
i = Int
insp Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
maxN
    Table
table <- TVar Table -> IO Table
forall a. TVar a -> IO a
readTVarIO TVar Table
circularTable
    STM () -> IO ()
forall a. STM a -> IO a
atomically (STM () -> IO ()) -> STM () -> IO ()
forall a b. (a -> b) -> a -> b
$ Table -> Int -> Entry -> STM ()
forall i. Ix i => TArray i Entry -> Int -> Entry -> STM ()
forall (a :: * -> * -> *) e (m :: * -> *) i.
(MArray a e m, Ix i) =>
a i e -> Int -> e -> m ()
unsafeWrite Table
table Int
i Entry
ent
    let revtbl :: RevIndex
revtbl = DynamicTable -> RevIndex
getRevIndex DynamicTable
dyntbl
    let ai :: AbsoluteIndex
ai = Int -> AbsoluteIndex
AbsoluteIndex Int
insp
    Entry -> AbsoluteIndex -> RevIndex -> IO ()
insertRevIndex Entry
ent AbsoluteIndex
ai RevIndex
revtbl
    STM () -> IO ()
forall a. STM a -> IO a
atomically (STM () -> IO ()) -> STM () -> IO ()
forall a b. (a -> b) -> a -> b
$ TVar Int -> (Int -> Int) -> STM ()
forall a. TVar a -> (a -> a) -> STM ()
modifyTVar' TVar Int
tableSize (Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Entry -> Int
entrySize Entry
ent)
    DynamicTable -> IO ()
dropIfNecessary DynamicTable
dyntbl
    DynamicTable -> AbsoluteIndex -> IO ()
resetReference DynamicTable
dyntbl AbsoluteIndex
ai
    AbsoluteIndex -> IO AbsoluteIndex
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return AbsoluteIndex
ai

insertEntryToDecoder :: Entry -> DynamicTable -> STM AbsoluteIndex
insertEntryToDecoder :: Entry -> DynamicTable -> STM AbsoluteIndex
insertEntryToDecoder Entry
ent DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} = do
    x :: InsertionPoint
x@(InsertionPoint Int
insp) <- TVar InsertionPoint -> STM InsertionPoint
forall a. TVar a -> STM a
readTVar TVar InsertionPoint
insertionPoint
    TVar InsertionPoint -> InsertionPoint -> STM ()
forall a. TVar a -> a -> STM ()
writeTVar TVar InsertionPoint
insertionPoint (InsertionPoint
x InsertionPoint -> InsertionPoint -> InsertionPoint
forall a. Num a => a -> a -> a
+ InsertionPoint
1)
    Int
maxN <- TVar Int -> STM Int
forall a. TVar a -> STM a
readTVar TVar Int
maxNumOfEntries
    let i :: Int
i = Int
insp Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
maxN
    Table
table <- TVar Table -> STM Table
forall a. TVar a -> STM a
readTVar TVar Table
circularTable
    Table -> Int -> Entry -> STM ()
forall i. Ix i => TArray i Entry -> Int -> Entry -> STM ()
forall (a :: * -> * -> *) e (m :: * -> *) i.
(MArray a e m, Ix i) =>
a i e -> Int -> e -> m ()
unsafeWrite Table
table Int
i Entry
ent
    TVar Int -> (Int -> Int) -> STM ()
forall a. TVar a -> (a -> a) -> STM ()
modifyTVar' TVar Int
tableSize (Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Entry -> Int
entrySize Entry
ent)
    AbsoluteIndex -> STM AbsoluteIndex
forall a. a -> STM a
forall (m :: * -> *) a. Monad m => a -> m a
return (AbsoluteIndex -> STM AbsoluteIndex)
-> AbsoluteIndex -> STM AbsoluteIndex
forall a b. (a -> b) -> a -> b
$ Int -> AbsoluteIndex
AbsoluteIndex Int
insp

toDynamicEntry :: DynamicTable -> AbsoluteIndex -> STM Entry
toDynamicEntry :: DynamicTable -> AbsoluteIndex -> STM Entry
toDynamicEntry DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} (AbsoluteIndex Int
idx) = do
    Int
maxN <- TVar Int -> STM Int
forall a. TVar a -> STM a
readTVar TVar Int
maxNumOfEntries
    let i :: Int
i = Int
idx Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
maxN
    Table
table <- TVar Table -> STM Table
forall a. TVar a -> STM a
readTVar TVar Table
circularTable
    Table -> Int -> STM Entry
forall i. Ix i => TArray i Entry -> Int -> STM Entry
forall (a :: * -> * -> *) e (m :: * -> *) i.
(MArray a e m, Ix i) =>
a i e -> Int -> m e
unsafeRead Table
table Int
i

----------------------------------------------------------------

insertSection :: DynamicTable -> StreamId -> Section -> IO ()
insertSection :: DynamicTable -> Int -> Section -> IO ()
insertSection DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} Int
sid Section
section = IORef (IntMap Section)
-> (IntMap Section -> (IntMap Section, ())) -> IO ()
forall a b. IORef a -> (a -> (a, b)) -> IO b
atomicModifyIORef' IORef (IntMap Section)
sections IntMap Section -> (IntMap Section, ())
ins
  where
    ins :: IntMap Section -> (IntMap Section, ())
ins IntMap Section
m =
        let m' :: IntMap Section
m' = Int -> Section -> IntMap Section -> IntMap Section
forall a. Int -> a -> IntMap a -> IntMap a
IntMap.insert Int
sid Section
section IntMap Section
m
         in (IntMap Section
m', ())
    EncodeInfo{TVar Int
IORef Bool
IORef (IOArray Int Reference)
IORef (Set Int)
IORef (IntMap Section)
IORef RequiredInsertCount
IORef AbsoluteIndex
LRUCacheRef (FieldValue, FieldValue) ()
RevIndex
revIndex :: CodeInfo -> RevIndex
requiredInsertCount :: CodeInfo -> IORef RequiredInsertCount
droppingPoint :: CodeInfo -> IORef AbsoluteIndex
drainingPoint :: CodeInfo -> IORef AbsoluteIndex
knownReceivedCount :: CodeInfo -> TVar Int
referenceCounters :: CodeInfo -> IORef (IOArray Int Reference)
sections :: CodeInfo -> IORef (IntMap Section)
lruCache :: CodeInfo -> LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: CodeInfo -> IORef Bool
blockedStreamsE :: CodeInfo -> IORef (Set Int)
sections :: IORef (IntMap Section)
revIndex :: RevIndex
requiredInsertCount :: IORef RequiredInsertCount
droppingPoint :: IORef AbsoluteIndex
drainingPoint :: IORef AbsoluteIndex
knownReceivedCount :: TVar Int
referenceCounters :: IORef (IOArray Int Reference)
lruCache :: LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: IORef Bool
blockedStreamsE :: IORef (Set Int)
..} = CodeInfo
codeInfo

getAndDelSection :: DynamicTable -> StreamId -> IO (Maybe Section)
getAndDelSection :: DynamicTable -> Int -> IO (Maybe Section)
getAndDelSection DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} Int
sid = IORef (IntMap Section)
-> (IntMap Section -> (IntMap Section, Maybe Section))
-> IO (Maybe Section)
forall a b. IORef a -> (a -> (a, b)) -> IO b
atomicModifyIORef' IORef (IntMap Section)
sections IntMap Section -> (IntMap Section, Maybe Section)
forall {a}. IntMap a -> (IntMap a, Maybe a)
getAndDel
  where
    getAndDel :: IntMap a -> (IntMap a, Maybe a)
getAndDel IntMap a
m =
        let (Maybe a
msec, IntMap a
m') = (Int -> a -> Maybe a) -> Int -> IntMap a -> (Maybe a, IntMap a)
forall a.
(Int -> a -> Maybe a) -> Int -> IntMap a -> (Maybe a, IntMap a)
IntMap.updateLookupWithKey Int -> a -> Maybe a
forall {p} {p} {a}. p -> p -> Maybe a
f Int
sid IntMap a
m
         in (IntMap a
m', Maybe a
msec)
    f :: p -> p -> Maybe a
f p
_ p
_ = Maybe a
forall a. Maybe a
Nothing -- delete the entry if found
    EncodeInfo{TVar Int
IORef Bool
IORef (IOArray Int Reference)
IORef (Set Int)
IORef (IntMap Section)
IORef RequiredInsertCount
IORef AbsoluteIndex
LRUCacheRef (FieldValue, FieldValue) ()
RevIndex
revIndex :: CodeInfo -> RevIndex
requiredInsertCount :: CodeInfo -> IORef RequiredInsertCount
droppingPoint :: CodeInfo -> IORef AbsoluteIndex
drainingPoint :: CodeInfo -> IORef AbsoluteIndex
knownReceivedCount :: CodeInfo -> TVar Int
referenceCounters :: CodeInfo -> IORef (IOArray Int Reference)
sections :: CodeInfo -> IORef (IntMap Section)
lruCache :: CodeInfo -> LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: CodeInfo -> IORef Bool
blockedStreamsE :: CodeInfo -> IORef (Set Int)
sections :: IORef (IntMap Section)
revIndex :: RevIndex
requiredInsertCount :: IORef RequiredInsertCount
droppingPoint :: IORef AbsoluteIndex
drainingPoint :: IORef AbsoluteIndex
knownReceivedCount :: TVar Int
referenceCounters :: IORef (IOArray Int Reference)
lruCache :: LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: IORef Bool
blockedStreamsE :: IORef (Set Int)
..} = CodeInfo
codeInfo

increaseReference :: DynamicTable -> AbsoluteIndex -> IO ()
increaseReference :: DynamicTable -> AbsoluteIndex -> IO ()
increaseReference = (Reference -> Reference) -> DynamicTable -> AbsoluteIndex -> IO ()
modifyReference ((Reference -> Reference)
 -> DynamicTable -> AbsoluteIndex -> IO ())
-> (Reference -> Reference)
-> DynamicTable
-> AbsoluteIndex
-> IO ()
forall a b. (a -> b) -> a -> b
$ \(Reference Int
c Int
t) -> Int -> Int -> Reference
Reference (Int
c Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) (Int
t Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)

decreaseReference :: DynamicTable -> AbsoluteIndex -> IO ()
decreaseReference :: DynamicTable -> AbsoluteIndex -> IO ()
decreaseReference = (Reference -> Reference) -> DynamicTable -> AbsoluteIndex -> IO ()
modifyReference ((Reference -> Reference)
 -> DynamicTable -> AbsoluteIndex -> IO ())
-> (Reference -> Reference)
-> DynamicTable
-> AbsoluteIndex
-> IO ()
forall a b. (a -> b) -> a -> b
$ \(Reference Int
c Int
t) -> Int -> Int -> Reference
Reference (Int
c Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) Int
t

modifyReference
    :: (Reference -> Reference) -> DynamicTable -> AbsoluteIndex -> IO ()
modifyReference :: (Reference -> Reference) -> DynamicTable -> AbsoluteIndex -> IO ()
modifyReference Reference -> Reference
func DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} (AbsoluteIndex Int
idx) = do
    Int
maxN <- TVar Int -> IO Int
forall a. TVar a -> IO a
readTVarIO TVar Int
maxNumOfEntries
    let i :: Int
i = Int
idx Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
maxN
    IOArray Int Reference
arr <- IORef (IOArray Int Reference) -> IO (IOArray Int Reference)
forall a. IORef a -> IO a
readIORef IORef (IOArray Int Reference)
referenceCounters
    -- modifyArray' is not provided by GHC 9.4 or earlier, sigh.
    Reference
x <- IOArray Int Reference -> Int -> IO Reference
forall i. Ix i => IOArray i Reference -> Int -> IO Reference
forall (a :: * -> * -> *) e (m :: * -> *) i.
(MArray a e m, Ix i) =>
a i e -> Int -> m e
unsafeRead IOArray Int Reference
arr Int
i
    let x' :: Reference
x' = Reference -> Reference
func Reference
x
    IOArray Int Reference -> Int -> Reference -> IO ()
forall i. Ix i => IOArray i Reference -> Int -> Reference -> IO ()
forall (a :: * -> * -> *) e (m :: * -> *) i.
(MArray a e m, Ix i) =>
a i e -> Int -> e -> m ()
unsafeWrite IOArray Int Reference
arr Int
i Reference
x'
  where
    EncodeInfo{TVar Int
IORef Bool
IORef (IOArray Int Reference)
IORef (Set Int)
IORef (IntMap Section)
IORef RequiredInsertCount
IORef AbsoluteIndex
LRUCacheRef (FieldValue, FieldValue) ()
RevIndex
revIndex :: CodeInfo -> RevIndex
requiredInsertCount :: CodeInfo -> IORef RequiredInsertCount
droppingPoint :: CodeInfo -> IORef AbsoluteIndex
drainingPoint :: CodeInfo -> IORef AbsoluteIndex
knownReceivedCount :: CodeInfo -> TVar Int
referenceCounters :: CodeInfo -> IORef (IOArray Int Reference)
sections :: CodeInfo -> IORef (IntMap Section)
lruCache :: CodeInfo -> LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: CodeInfo -> IORef Bool
blockedStreamsE :: CodeInfo -> IORef (Set Int)
referenceCounters :: IORef (IOArray Int Reference)
revIndex :: RevIndex
requiredInsertCount :: IORef RequiredInsertCount
droppingPoint :: IORef AbsoluteIndex
drainingPoint :: IORef AbsoluteIndex
knownReceivedCount :: TVar Int
sections :: IORef (IntMap Section)
lruCache :: LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: IORef Bool
blockedStreamsE :: IORef (Set Int)
..} = CodeInfo
codeInfo

resetReference :: DynamicTable -> AbsoluteIndex -> IO ()
resetReference :: DynamicTable -> AbsoluteIndex -> IO ()
resetReference DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} (AbsoluteIndex Int
idx) = do
    Int
maxN <- TVar Int -> IO Int
forall a. TVar a -> IO a
readTVarIO TVar Int
maxNumOfEntries
    let i :: Int
i = Int
idx Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
maxN
    IOArray Int Reference
arr <- IORef (IOArray Int Reference) -> IO (IOArray Int Reference)
forall a. IORef a -> IO a
readIORef IORef (IOArray Int Reference)
referenceCounters
    IOArray Int Reference -> Int -> Reference -> IO ()
forall i. Ix i => IOArray i Reference -> Int -> Reference -> IO ()
forall (a :: * -> * -> *) e (m :: * -> *) i.
(MArray a e m, Ix i) =>
a i e -> Int -> e -> m ()
unsafeWrite IOArray Int Reference
arr Int
i (Reference -> IO ()) -> Reference -> IO ()
forall a b. (a -> b) -> a -> b
$ Int -> Int -> Reference
Reference Int
0 Int
0
  where
    EncodeInfo{TVar Int
IORef Bool
IORef (IOArray Int Reference)
IORef (Set Int)
IORef (IntMap Section)
IORef RequiredInsertCount
IORef AbsoluteIndex
LRUCacheRef (FieldValue, FieldValue) ()
RevIndex
revIndex :: CodeInfo -> RevIndex
requiredInsertCount :: CodeInfo -> IORef RequiredInsertCount
droppingPoint :: CodeInfo -> IORef AbsoluteIndex
drainingPoint :: CodeInfo -> IORef AbsoluteIndex
knownReceivedCount :: CodeInfo -> TVar Int
referenceCounters :: CodeInfo -> IORef (IOArray Int Reference)
sections :: CodeInfo -> IORef (IntMap Section)
lruCache :: CodeInfo -> LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: CodeInfo -> IORef Bool
blockedStreamsE :: CodeInfo -> IORef (Set Int)
referenceCounters :: IORef (IOArray Int Reference)
revIndex :: RevIndex
requiredInsertCount :: IORef RequiredInsertCount
droppingPoint :: IORef AbsoluteIndex
drainingPoint :: IORef AbsoluteIndex
knownReceivedCount :: TVar Int
sections :: IORef (IntMap Section)
lruCache :: LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: IORef Bool
blockedStreamsE :: IORef (Set Int)
..} = CodeInfo
codeInfo

----------------------------------------------------------------

getMaxBlockedStreams :: DynamicTable -> IO Int
getMaxBlockedStreams :: DynamicTable -> IO Int
getMaxBlockedStreams DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} = IORef Int -> IO Int
forall a. IORef a -> IO a
readIORef IORef Int
maxBlockedStreams

setMaxBlockedStreams :: DynamicTable -> Int -> IO ()
setMaxBlockedStreams :: DynamicTable -> Int -> IO ()
setMaxBlockedStreams DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} Int
n = IORef Int -> Int -> IO ()
forall a. IORef a -> a -> IO ()
writeIORef IORef Int
maxBlockedStreams Int
n

-- Decoder

tryIncreaseStreams :: DynamicTable -> IO Bool
tryIncreaseStreams :: DynamicTable -> IO Bool
tryIncreaseStreams DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} = do
    Int
lim <- IORef Int -> IO Int
forall a. IORef a -> IO a
readIORef IORef Int
maxBlockedStreams
    Int
curr <- IORef Int -> (Int -> (Int, Int)) -> IO Int
forall a b. IORef a -> (a -> (a, b)) -> IO b
atomicModifyIORef' IORef Int
blockedStreamsD (\Int
n -> (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1, Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1))
    Bool -> IO Bool
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Int
curr Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
lim)
  where
    DecodeInfo{IORef Int
HuffmanDecoder
huffmanDecoder :: CodeInfo -> HuffmanDecoder
blockedStreamsD :: CodeInfo -> IORef Int
blockedStreamsD :: IORef Int
huffmanDecoder :: HuffmanDecoder
..} = CodeInfo
codeInfo

decreaseStreams :: DynamicTable -> IO ()
decreaseStreams :: DynamicTable -> IO ()
decreaseStreams DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} = IORef Int -> (Int -> (Int, ())) -> IO ()
forall a b. IORef a -> (a -> (a, b)) -> IO b
atomicModifyIORef' IORef Int
blockedStreamsD (\Int
n -> (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1, ()))
  where
    DecodeInfo{IORef Int
HuffmanDecoder
huffmanDecoder :: CodeInfo -> HuffmanDecoder
blockedStreamsD :: CodeInfo -> IORef Int
blockedStreamsD :: IORef Int
huffmanDecoder :: HuffmanDecoder
..} = CodeInfo
codeInfo

----------------------------------------------------------------

getBlockedStreamsE :: DynamicTable -> IO Int
getBlockedStreamsE :: DynamicTable -> IO Int
getBlockedStreamsE DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} =
    Set Int -> Int
forall a. Set a -> Int
Set.size (Set Int -> Int) -> IO (Set Int) -> IO Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IORef (Set Int) -> IO (Set Int)
forall a. IORef a -> IO a
readIORef IORef (Set Int)
blockedStreamsE
  where
    EncodeInfo{TVar Int
IORef Bool
IORef (IOArray Int Reference)
IORef (Set Int)
IORef (IntMap Section)
IORef RequiredInsertCount
IORef AbsoluteIndex
LRUCacheRef (FieldValue, FieldValue) ()
RevIndex
revIndex :: CodeInfo -> RevIndex
requiredInsertCount :: CodeInfo -> IORef RequiredInsertCount
droppingPoint :: CodeInfo -> IORef AbsoluteIndex
drainingPoint :: CodeInfo -> IORef AbsoluteIndex
knownReceivedCount :: CodeInfo -> TVar Int
referenceCounters :: CodeInfo -> IORef (IOArray Int Reference)
sections :: CodeInfo -> IORef (IntMap Section)
lruCache :: CodeInfo -> LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: CodeInfo -> IORef Bool
blockedStreamsE :: CodeInfo -> IORef (Set Int)
blockedStreamsE :: IORef (Set Int)
revIndex :: RevIndex
requiredInsertCount :: IORef RequiredInsertCount
droppingPoint :: IORef AbsoluteIndex
drainingPoint :: IORef AbsoluteIndex
knownReceivedCount :: TVar Int
referenceCounters :: IORef (IOArray Int Reference)
sections :: IORef (IntMap Section)
lruCache :: LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: IORef Bool
..} = CodeInfo
codeInfo

insertBlockedStreamE :: DynamicTable -> StreamId -> IO ()
insertBlockedStreamE :: DynamicTable -> Int -> IO ()
insertBlockedStreamE DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} Int
sid =
    IORef (Set Int) -> (Set Int -> Set Int) -> IO ()
forall a. IORef a -> (a -> a) -> IO ()
modifyIORef' IORef (Set Int)
blockedStreamsE (Int -> Set Int -> Set Int
forall a. Ord a => a -> Set a -> Set a
Set.insert Int
sid)
  where
    EncodeInfo{TVar Int
IORef Bool
IORef (IOArray Int Reference)
IORef (Set Int)
IORef (IntMap Section)
IORef RequiredInsertCount
IORef AbsoluteIndex
LRUCacheRef (FieldValue, FieldValue) ()
RevIndex
revIndex :: CodeInfo -> RevIndex
requiredInsertCount :: CodeInfo -> IORef RequiredInsertCount
droppingPoint :: CodeInfo -> IORef AbsoluteIndex
drainingPoint :: CodeInfo -> IORef AbsoluteIndex
knownReceivedCount :: CodeInfo -> TVar Int
referenceCounters :: CodeInfo -> IORef (IOArray Int Reference)
sections :: CodeInfo -> IORef (IntMap Section)
lruCache :: CodeInfo -> LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: CodeInfo -> IORef Bool
blockedStreamsE :: CodeInfo -> IORef (Set Int)
blockedStreamsE :: IORef (Set Int)
revIndex :: RevIndex
requiredInsertCount :: IORef RequiredInsertCount
droppingPoint :: IORef AbsoluteIndex
drainingPoint :: IORef AbsoluteIndex
knownReceivedCount :: TVar Int
referenceCounters :: IORef (IOArray Int Reference)
sections :: IORef (IntMap Section)
lruCache :: LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: IORef Bool
..} = CodeInfo
codeInfo

deleteBlockedStreamE :: DynamicTable -> StreamId -> IO ()
deleteBlockedStreamE :: DynamicTable -> Int -> IO ()
deleteBlockedStreamE DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} Int
sid =
    IORef (Set Int) -> (Set Int -> Set Int) -> IO ()
forall a. IORef a -> (a -> a) -> IO ()
modifyIORef' IORef (Set Int)
blockedStreamsE (Int -> Set Int -> Set Int
forall a. Ord a => a -> Set a -> Set a
Set.delete Int
sid)
  where
    EncodeInfo{TVar Int
IORef Bool
IORef (IOArray Int Reference)
IORef (Set Int)
IORef (IntMap Section)
IORef RequiredInsertCount
IORef AbsoluteIndex
LRUCacheRef (FieldValue, FieldValue) ()
RevIndex
revIndex :: CodeInfo -> RevIndex
requiredInsertCount :: CodeInfo -> IORef RequiredInsertCount
droppingPoint :: CodeInfo -> IORef AbsoluteIndex
drainingPoint :: CodeInfo -> IORef AbsoluteIndex
knownReceivedCount :: CodeInfo -> TVar Int
referenceCounters :: CodeInfo -> IORef (IOArray Int Reference)
sections :: CodeInfo -> IORef (IntMap Section)
lruCache :: CodeInfo -> LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: CodeInfo -> IORef Bool
blockedStreamsE :: CodeInfo -> IORef (Set Int)
blockedStreamsE :: IORef (Set Int)
revIndex :: RevIndex
requiredInsertCount :: IORef RequiredInsertCount
droppingPoint :: IORef AbsoluteIndex
drainingPoint :: IORef AbsoluteIndex
knownReceivedCount :: TVar Int
referenceCounters :: IORef (IOArray Int Reference)
sections :: IORef (IntMap Section)
lruCache :: LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: IORef Bool
..} = CodeInfo
codeInfo

checkBlockedStreams :: DynamicTable -> IO Bool
checkBlockedStreams :: DynamicTable -> IO Bool
checkBlockedStreams DynamicTable
dyntbl = do
    Int
maxBlocked <- DynamicTable -> IO Int
getMaxBlockedStreams DynamicTable
dyntbl
    Int
blocked <- DynamicTable -> IO Int
getBlockedStreamsE DynamicTable
dyntbl
    -- The next one would be blocked, so <, not <=
    Bool -> IO Bool
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Bool -> IO Bool) -> Bool -> IO Bool
forall a b. (a -> b) -> a -> b
$ Int
blocked Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
maxBlocked

----------------------------------------------------------------

getRequiredInsertCount :: DynamicTable -> IO RequiredInsertCount
getRequiredInsertCount :: DynamicTable -> IO RequiredInsertCount
getRequiredInsertCount DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} = IORef RequiredInsertCount -> IO RequiredInsertCount
forall a. IORef a -> IO a
readIORef IORef RequiredInsertCount
requiredInsertCount
  where
    EncodeInfo{TVar Int
IORef Bool
IORef (IOArray Int Reference)
IORef (Set Int)
IORef (IntMap Section)
IORef RequiredInsertCount
IORef AbsoluteIndex
LRUCacheRef (FieldValue, FieldValue) ()
RevIndex
revIndex :: CodeInfo -> RevIndex
requiredInsertCount :: CodeInfo -> IORef RequiredInsertCount
droppingPoint :: CodeInfo -> IORef AbsoluteIndex
drainingPoint :: CodeInfo -> IORef AbsoluteIndex
knownReceivedCount :: CodeInfo -> TVar Int
referenceCounters :: CodeInfo -> IORef (IOArray Int Reference)
sections :: CodeInfo -> IORef (IntMap Section)
lruCache :: CodeInfo -> LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: CodeInfo -> IORef Bool
blockedStreamsE :: CodeInfo -> IORef (Set Int)
requiredInsertCount :: IORef RequiredInsertCount
revIndex :: RevIndex
droppingPoint :: IORef AbsoluteIndex
drainingPoint :: IORef AbsoluteIndex
knownReceivedCount :: TVar Int
referenceCounters :: IORef (IOArray Int Reference)
sections :: IORef (IntMap Section)
lruCache :: LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: IORef Bool
blockedStreamsE :: IORef (Set Int)
..} = CodeInfo
codeInfo

clearRequiredInsertCount :: DynamicTable -> IO ()
clearRequiredInsertCount :: DynamicTable -> IO ()
clearRequiredInsertCount DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} = IORef RequiredInsertCount -> RequiredInsertCount -> IO ()
forall a. IORef a -> a -> IO ()
writeIORef IORef RequiredInsertCount
requiredInsertCount RequiredInsertCount
0
  where
    EncodeInfo{TVar Int
IORef Bool
IORef (IOArray Int Reference)
IORef (Set Int)
IORef (IntMap Section)
IORef RequiredInsertCount
IORef AbsoluteIndex
LRUCacheRef (FieldValue, FieldValue) ()
RevIndex
revIndex :: CodeInfo -> RevIndex
requiredInsertCount :: CodeInfo -> IORef RequiredInsertCount
droppingPoint :: CodeInfo -> IORef AbsoluteIndex
drainingPoint :: CodeInfo -> IORef AbsoluteIndex
knownReceivedCount :: CodeInfo -> TVar Int
referenceCounters :: CodeInfo -> IORef (IOArray Int Reference)
sections :: CodeInfo -> IORef (IntMap Section)
lruCache :: CodeInfo -> LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: CodeInfo -> IORef Bool
blockedStreamsE :: CodeInfo -> IORef (Set Int)
requiredInsertCount :: IORef RequiredInsertCount
revIndex :: RevIndex
droppingPoint :: IORef AbsoluteIndex
drainingPoint :: IORef AbsoluteIndex
knownReceivedCount :: TVar Int
referenceCounters :: IORef (IOArray Int Reference)
sections :: IORef (IntMap Section)
lruCache :: LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: IORef Bool
blockedStreamsE :: IORef (Set Int)
..} = CodeInfo
codeInfo

checkRequiredInsertCount :: DynamicTable -> RequiredInsertCount -> IO ()
checkRequiredInsertCount :: DynamicTable -> RequiredInsertCount -> IO ()
checkRequiredInsertCount DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} (RequiredInsertCount Int
reqip) = STM () -> IO ()
forall a. STM a -> IO a
atomically (STM () -> IO ()) -> STM () -> IO ()
forall a b. (a -> b) -> a -> b
$ do
    InsertionPoint Int
ip <- TVar InsertionPoint -> STM InsertionPoint
forall a. TVar a -> STM a
readTVar TVar InsertionPoint
insertionPoint
    -- RequiredInsertCount is index + 1
    -- InsertionPoin is index + 1
    -- So, equal is necessary.
    Bool -> STM ()
check (Int
reqip Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
ip)

checkRequiredInsertCountNB :: DynamicTable -> RequiredInsertCount -> IO Bool
checkRequiredInsertCountNB :: DynamicTable -> RequiredInsertCount -> IO Bool
checkRequiredInsertCountNB DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} (RequiredInsertCount Int
reqip) = STM Bool -> IO Bool
forall a. STM a -> IO a
atomically (STM Bool -> IO Bool) -> STM Bool -> IO Bool
forall a b. (a -> b) -> a -> b
$ do
    InsertionPoint Int
ip <- TVar InsertionPoint -> STM InsertionPoint
forall a. TVar a -> STM a
readTVar TVar InsertionPoint
insertionPoint
    Bool -> STM Bool
forall a. a -> STM a
forall (m :: * -> *) a. Monad m => a -> m a
return (Int
reqip Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
ip)

absoluteIndexToRequiredInsertCount :: AbsoluteIndex -> RequiredInsertCount
absoluteIndexToRequiredInsertCount :: AbsoluteIndex -> RequiredInsertCount
absoluteIndexToRequiredInsertCount (AbsoluteIndex Int
idx) =
    Int -> RequiredInsertCount
RequiredInsertCount (Int
idx Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)

updateRequiredInsertCount :: DynamicTable -> AbsoluteIndex -> IO ()
updateRequiredInsertCount :: DynamicTable -> AbsoluteIndex -> IO ()
updateRequiredInsertCount DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} AbsoluteIndex
aidx = do
    let newric :: RequiredInsertCount
newric = AbsoluteIndex -> RequiredInsertCount
absoluteIndexToRequiredInsertCount AbsoluteIndex
aidx
    RequiredInsertCount
oldric <- IORef RequiredInsertCount -> IO RequiredInsertCount
forall a. IORef a -> IO a
readIORef IORef RequiredInsertCount
requiredInsertCount
    Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (RequiredInsertCount
newric RequiredInsertCount -> RequiredInsertCount -> Bool
forall a. Ord a => a -> a -> Bool
> RequiredInsertCount
oldric) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$ IORef RequiredInsertCount -> RequiredInsertCount -> IO ()
forall a. IORef a -> a -> IO ()
writeIORef IORef RequiredInsertCount
requiredInsertCount RequiredInsertCount
newric
  where
    EncodeInfo{TVar Int
IORef Bool
IORef (IOArray Int Reference)
IORef (Set Int)
IORef (IntMap Section)
IORef RequiredInsertCount
IORef AbsoluteIndex
LRUCacheRef (FieldValue, FieldValue) ()
RevIndex
revIndex :: CodeInfo -> RevIndex
requiredInsertCount :: CodeInfo -> IORef RequiredInsertCount
droppingPoint :: CodeInfo -> IORef AbsoluteIndex
drainingPoint :: CodeInfo -> IORef AbsoluteIndex
knownReceivedCount :: CodeInfo -> TVar Int
referenceCounters :: CodeInfo -> IORef (IOArray Int Reference)
sections :: CodeInfo -> IORef (IntMap Section)
lruCache :: CodeInfo -> LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: CodeInfo -> IORef Bool
blockedStreamsE :: CodeInfo -> IORef (Set Int)
requiredInsertCount :: IORef RequiredInsertCount
revIndex :: RevIndex
droppingPoint :: IORef AbsoluteIndex
drainingPoint :: IORef AbsoluteIndex
knownReceivedCount :: TVar Int
referenceCounters :: IORef (IOArray Int Reference)
sections :: IORef (IntMap Section)
lruCache :: LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: IORef Bool
blockedStreamsE :: IORef (Set Int)
..} = CodeInfo
codeInfo

----------------------------------------------------------------

incrementKnownReceivedCount :: DynamicTable -> Int -> IO ()
incrementKnownReceivedCount :: DynamicTable -> Int -> IO ()
incrementKnownReceivedCount DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} Int
n =
    STM () -> IO ()
forall a. STM a -> IO a
atomically (STM () -> IO ()) -> STM () -> IO ()
forall a b. (a -> b) -> a -> b
$ TVar Int -> (Int -> Int) -> STM ()
forall a. TVar a -> (a -> a) -> STM ()
modifyTVar' TVar Int
knownReceivedCount (Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
n)
  where
    EncodeInfo{TVar Int
IORef Bool
IORef (IOArray Int Reference)
IORef (Set Int)
IORef (IntMap Section)
IORef RequiredInsertCount
IORef AbsoluteIndex
LRUCacheRef (FieldValue, FieldValue) ()
RevIndex
revIndex :: CodeInfo -> RevIndex
requiredInsertCount :: CodeInfo -> IORef RequiredInsertCount
droppingPoint :: CodeInfo -> IORef AbsoluteIndex
drainingPoint :: CodeInfo -> IORef AbsoluteIndex
knownReceivedCount :: CodeInfo -> TVar Int
referenceCounters :: CodeInfo -> IORef (IOArray Int Reference)
sections :: CodeInfo -> IORef (IntMap Section)
lruCache :: CodeInfo -> LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: CodeInfo -> IORef Bool
blockedStreamsE :: CodeInfo -> IORef (Set Int)
knownReceivedCount :: TVar Int
revIndex :: RevIndex
requiredInsertCount :: IORef RequiredInsertCount
droppingPoint :: IORef AbsoluteIndex
drainingPoint :: IORef AbsoluteIndex
referenceCounters :: IORef (IOArray Int Reference)
sections :: IORef (IntMap Section)
lruCache :: LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: IORef Bool
blockedStreamsE :: IORef (Set Int)
..} = CodeInfo
codeInfo

updateKnownReceivedCount :: DynamicTable -> RequiredInsertCount -> IO ()
updateKnownReceivedCount :: DynamicTable -> RequiredInsertCount -> IO ()
updateKnownReceivedCount DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} (RequiredInsertCount Int
reqInsCnt) =
    STM () -> IO ()
forall a. STM a -> IO a
atomically (STM () -> IO ()) -> STM () -> IO ()
forall a b. (a -> b) -> a -> b
$ TVar Int -> (Int -> Int) -> STM ()
forall a. TVar a -> (a -> a) -> STM ()
modifyTVar' TVar Int
knownReceivedCount ((Int -> Int) -> STM ()) -> (Int -> Int) -> STM ()
forall a b. (a -> b) -> a -> b
$ \Int
krc -> Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
reqInsCnt Int
krc
  where
    EncodeInfo{TVar Int
IORef Bool
IORef (IOArray Int Reference)
IORef (Set Int)
IORef (IntMap Section)
IORef RequiredInsertCount
IORef AbsoluteIndex
LRUCacheRef (FieldValue, FieldValue) ()
RevIndex
revIndex :: CodeInfo -> RevIndex
requiredInsertCount :: CodeInfo -> IORef RequiredInsertCount
droppingPoint :: CodeInfo -> IORef AbsoluteIndex
drainingPoint :: CodeInfo -> IORef AbsoluteIndex
knownReceivedCount :: CodeInfo -> TVar Int
referenceCounters :: CodeInfo -> IORef (IOArray Int Reference)
sections :: CodeInfo -> IORef (IntMap Section)
lruCache :: CodeInfo -> LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: CodeInfo -> IORef Bool
blockedStreamsE :: CodeInfo -> IORef (Set Int)
knownReceivedCount :: TVar Int
revIndex :: RevIndex
requiredInsertCount :: IORef RequiredInsertCount
droppingPoint :: IORef AbsoluteIndex
drainingPoint :: IORef AbsoluteIndex
referenceCounters :: IORef (IOArray Int Reference)
sections :: IORef (IntMap Section)
lruCache :: LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: IORef Bool
blockedStreamsE :: IORef (Set Int)
..} = CodeInfo
codeInfo

wouldSectionBeBlocked :: DynamicTable -> RequiredInsertCount -> IO Bool
wouldSectionBeBlocked :: DynamicTable -> RequiredInsertCount -> IO Bool
wouldSectionBeBlocked DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} (RequiredInsertCount Int
reqip) = STM Bool -> IO Bool
forall a. STM a -> IO a
atomically (STM Bool -> IO Bool) -> STM Bool -> IO Bool
forall a b. (a -> b) -> a -> b
$ do
    Int
krc <- TVar Int -> STM Int
forall a. TVar a -> STM a
readTVar TVar Int
knownReceivedCount
    Bool -> STM Bool
forall a. a -> STM a
forall (m :: * -> *) a. Monad m => a -> m a
return (Int
reqip Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
krc)
  where
    EncodeInfo{TVar Int
IORef Bool
IORef (IOArray Int Reference)
IORef (Set Int)
IORef (IntMap Section)
IORef RequiredInsertCount
IORef AbsoluteIndex
LRUCacheRef (FieldValue, FieldValue) ()
RevIndex
revIndex :: CodeInfo -> RevIndex
requiredInsertCount :: CodeInfo -> IORef RequiredInsertCount
droppingPoint :: CodeInfo -> IORef AbsoluteIndex
drainingPoint :: CodeInfo -> IORef AbsoluteIndex
knownReceivedCount :: CodeInfo -> TVar Int
referenceCounters :: CodeInfo -> IORef (IOArray Int Reference)
sections :: CodeInfo -> IORef (IntMap Section)
lruCache :: CodeInfo -> LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: CodeInfo -> IORef Bool
blockedStreamsE :: CodeInfo -> IORef (Set Int)
knownReceivedCount :: TVar Int
revIndex :: RevIndex
requiredInsertCount :: IORef RequiredInsertCount
droppingPoint :: IORef AbsoluteIndex
drainingPoint :: IORef AbsoluteIndex
referenceCounters :: IORef (IOArray Int Reference)
sections :: IORef (IntMap Section)
lruCache :: LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: IORef Bool
blockedStreamsE :: IORef (Set Int)
..} = CodeInfo
codeInfo

wouldInstructionBeBlocked :: DynamicTable -> AbsoluteIndex -> IO Bool
wouldInstructionBeBlocked :: DynamicTable -> AbsoluteIndex -> IO Bool
wouldInstructionBeBlocked DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} (AbsoluteIndex Int
ai) = STM Bool -> IO Bool
forall a. STM a -> IO a
atomically (STM Bool -> IO Bool) -> STM Bool -> IO Bool
forall a b. (a -> b) -> a -> b
$ do
    Int
krc <- TVar Int -> STM Int
forall a. TVar a -> STM a
readTVar TVar Int
knownReceivedCount
    Bool -> STM Bool
forall a. a -> STM a
forall (m :: * -> *) a. Monad m => a -> m a
return (Int
ai Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
krc)
  where
    EncodeInfo{TVar Int
IORef Bool
IORef (IOArray Int Reference)
IORef (Set Int)
IORef (IntMap Section)
IORef RequiredInsertCount
IORef AbsoluteIndex
LRUCacheRef (FieldValue, FieldValue) ()
RevIndex
revIndex :: CodeInfo -> RevIndex
requiredInsertCount :: CodeInfo -> IORef RequiredInsertCount
droppingPoint :: CodeInfo -> IORef AbsoluteIndex
drainingPoint :: CodeInfo -> IORef AbsoluteIndex
knownReceivedCount :: CodeInfo -> TVar Int
referenceCounters :: CodeInfo -> IORef (IOArray Int Reference)
sections :: CodeInfo -> IORef (IntMap Section)
lruCache :: CodeInfo -> LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: CodeInfo -> IORef Bool
blockedStreamsE :: CodeInfo -> IORef (Set Int)
knownReceivedCount :: TVar Int
revIndex :: RevIndex
requiredInsertCount :: IORef RequiredInsertCount
droppingPoint :: IORef AbsoluteIndex
drainingPoint :: IORef AbsoluteIndex
referenceCounters :: IORef (IOArray Int Reference)
sections :: IORef (IntMap Section)
lruCache :: LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: IORef Bool
blockedStreamsE :: IORef (Set Int)
..} = CodeInfo
codeInfo

setInsersionPointToKnownReceivedCount :: DynamicTable -> IO ()
setInsersionPointToKnownReceivedCount :: DynamicTable -> IO ()
setInsersionPointToKnownReceivedCount dyntbl :: DynamicTable
dyntbl@DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} = do
    InsertionPoint Int
ai <- DynamicTable -> IO InsertionPoint
getInsertionPoint DynamicTable
dyntbl
    STM () -> IO ()
forall a. STM a -> IO a
atomically (STM () -> IO ()) -> STM () -> IO ()
forall a b. (a -> b) -> a -> b
$ TVar Int -> Int -> STM ()
forall a. TVar a -> a -> STM ()
writeTVar TVar Int
knownReceivedCount Int
ai
  where
    EncodeInfo{TVar Int
IORef Bool
IORef (IOArray Int Reference)
IORef (Set Int)
IORef (IntMap Section)
IORef RequiredInsertCount
IORef AbsoluteIndex
LRUCacheRef (FieldValue, FieldValue) ()
RevIndex
revIndex :: CodeInfo -> RevIndex
requiredInsertCount :: CodeInfo -> IORef RequiredInsertCount
droppingPoint :: CodeInfo -> IORef AbsoluteIndex
drainingPoint :: CodeInfo -> IORef AbsoluteIndex
knownReceivedCount :: CodeInfo -> TVar Int
referenceCounters :: CodeInfo -> IORef (IOArray Int Reference)
sections :: CodeInfo -> IORef (IntMap Section)
lruCache :: CodeInfo -> LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: CodeInfo -> IORef Bool
blockedStreamsE :: CodeInfo -> IORef (Set Int)
knownReceivedCount :: TVar Int
revIndex :: RevIndex
requiredInsertCount :: IORef RequiredInsertCount
droppingPoint :: IORef AbsoluteIndex
drainingPoint :: IORef AbsoluteIndex
referenceCounters :: IORef (IOArray Int Reference)
sections :: IORef (IntMap Section)
lruCache :: LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: IORef Bool
blockedStreamsE :: IORef (Set Int)
..} = CodeInfo
codeInfo

----------------------------------------------------------------

getBasePoint :: DynamicTable -> IO BasePoint
getBasePoint :: DynamicTable -> IO BasePoint
getBasePoint DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} = IORef BasePoint -> IO BasePoint
forall a. IORef a -> IO a
readIORef IORef BasePoint
basePoint

setBasePointToInsersionPoint :: DynamicTable -> IO ()
setBasePointToInsersionPoint :: DynamicTable -> IO ()
setBasePointToInsersionPoint DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} = do
    InsertionPoint Int
ip <- TVar InsertionPoint -> IO InsertionPoint
forall a. TVar a -> IO a
readTVarIO TVar InsertionPoint
insertionPoint
    IORef BasePoint -> BasePoint -> IO ()
forall a. IORef a -> a -> IO ()
writeIORef IORef BasePoint
basePoint (BasePoint -> IO ()) -> BasePoint -> IO ()
forall a b. (a -> b) -> a -> b
$ Int -> BasePoint
BasePoint Int
ip

getInsertionPoint :: DynamicTable -> IO InsertionPoint
getInsertionPoint :: DynamicTable -> IO InsertionPoint
getInsertionPoint DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} = TVar InsertionPoint -> IO InsertionPoint
forall a. TVar a -> IO a
readTVarIO TVar InsertionPoint
insertionPoint

getInsertionPointSTM :: DynamicTable -> STM InsertionPoint
getInsertionPointSTM :: DynamicTable -> STM InsertionPoint
getInsertionPointSTM DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} = TVar InsertionPoint -> STM InsertionPoint
forall a. TVar a -> STM a
readTVar TVar InsertionPoint
insertionPoint

----------------------------------------------------------------

isDraining :: DynamicTable -> AbsoluteIndex -> IO Bool
isDraining :: DynamicTable -> AbsoluteIndex -> IO Bool
isDraining DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} AbsoluteIndex
ai = do
    AbsoluteIndex
di <- IORef AbsoluteIndex -> IO AbsoluteIndex
forall a. IORef a -> IO a
readIORef IORef AbsoluteIndex
drainingPoint
    Bool -> IO Bool
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (AbsoluteIndex
ai AbsoluteIndex -> AbsoluteIndex -> Bool
forall a. Ord a => a -> a -> Bool
<= AbsoluteIndex
di)
  where
    EncodeInfo{TVar Int
IORef Bool
IORef (IOArray Int Reference)
IORef (Set Int)
IORef (IntMap Section)
IORef RequiredInsertCount
IORef AbsoluteIndex
LRUCacheRef (FieldValue, FieldValue) ()
RevIndex
revIndex :: CodeInfo -> RevIndex
requiredInsertCount :: CodeInfo -> IORef RequiredInsertCount
droppingPoint :: CodeInfo -> IORef AbsoluteIndex
drainingPoint :: CodeInfo -> IORef AbsoluteIndex
knownReceivedCount :: CodeInfo -> TVar Int
referenceCounters :: CodeInfo -> IORef (IOArray Int Reference)
sections :: CodeInfo -> IORef (IntMap Section)
lruCache :: CodeInfo -> LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: CodeInfo -> IORef Bool
blockedStreamsE :: CodeInfo -> IORef (Set Int)
drainingPoint :: IORef AbsoluteIndex
revIndex :: RevIndex
requiredInsertCount :: IORef RequiredInsertCount
droppingPoint :: IORef AbsoluteIndex
knownReceivedCount :: TVar Int
referenceCounters :: IORef (IOArray Int Reference)
sections :: IORef (IntMap Section)
lruCache :: LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: IORef Bool
blockedStreamsE :: IORef (Set Int)
..} = CodeInfo
codeInfo

adjustDrainingPoint :: DynamicTable -> IO ()
adjustDrainingPoint :: DynamicTable -> IO ()
adjustDrainingPoint DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} = do
    InsertionPoint Int
beg <- TVar InsertionPoint -> IO InsertionPoint
forall a. TVar a -> IO a
readTVarIO TVar InsertionPoint
insertionPoint
    AbsoluteIndex Int
end <- IORef AbsoluteIndex -> IO AbsoluteIndex
forall a. IORef a -> IO a
readIORef IORef AbsoluteIndex
droppingPoint
    let num :: Int
num = Int
beg Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
end
        space :: Int
space = Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
1 (Int
num Int -> Int -> Int
forall a. Bits a => a -> Int -> a
!>>. Int
4)
        end' :: Int
end' = Int
beg Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
num Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
space
    IORef AbsoluteIndex -> AbsoluteIndex -> IO ()
forall a. IORef a -> a -> IO ()
writeIORef IORef AbsoluteIndex
drainingPoint (AbsoluteIndex -> IO ()) -> AbsoluteIndex -> IO ()
forall a b. (a -> b) -> a -> b
$ Int -> AbsoluteIndex
AbsoluteIndex Int
end'
    Table
table <- TVar Table -> IO Table
forall a. TVar a -> IO a
readTVarIO TVar Table
circularTable
    Int
maxN <- TVar Int -> IO Int
forall a. TVar a -> IO a
readTVarIO TVar Int
maxNumOfEntries
    Int -> Int -> Table -> Int -> IO ()
loop Int
end Int
end' Table
table Int
maxN
  where
    EncodeInfo{TVar Int
IORef Bool
IORef (IOArray Int Reference)
IORef (Set Int)
IORef (IntMap Section)
IORef RequiredInsertCount
IORef AbsoluteIndex
LRUCacheRef (FieldValue, FieldValue) ()
RevIndex
revIndex :: CodeInfo -> RevIndex
requiredInsertCount :: CodeInfo -> IORef RequiredInsertCount
droppingPoint :: CodeInfo -> IORef AbsoluteIndex
drainingPoint :: CodeInfo -> IORef AbsoluteIndex
knownReceivedCount :: CodeInfo -> TVar Int
referenceCounters :: CodeInfo -> IORef (IOArray Int Reference)
sections :: CodeInfo -> IORef (IntMap Section)
lruCache :: CodeInfo -> LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: CodeInfo -> IORef Bool
blockedStreamsE :: CodeInfo -> IORef (Set Int)
droppingPoint :: IORef AbsoluteIndex
drainingPoint :: IORef AbsoluteIndex
revIndex :: RevIndex
requiredInsertCount :: IORef RequiredInsertCount
knownReceivedCount :: TVar Int
referenceCounters :: IORef (IOArray Int Reference)
sections :: IORef (IntMap Section)
lruCache :: LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: IORef Bool
blockedStreamsE :: IORef (Set Int)
..} = CodeInfo
codeInfo
    loop :: Int -> Int -> Table -> Int -> IO ()
    loop :: Int -> Int -> Table -> Int -> IO ()
loop Int
ai Int
lim Table
table Int
maxN
        | Int
ai Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
lim = () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
        | Bool
otherwise = do
            let i :: Int
i = Int
ai Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
maxN
            Entry
ent <- STM Entry -> IO Entry
forall a. STM a -> IO a
atomically (STM Entry -> IO Entry) -> STM Entry -> IO Entry
forall a b. (a -> b) -> a -> b
$ Table -> Int -> STM Entry
forall i. Ix i => TArray i Entry -> Int -> STM Entry
forall (a :: * -> * -> *) e (m :: * -> *) i.
(MArray a e m, Ix i) =>
a i e -> Int -> m e
unsafeRead Table
table Int
i
            RevIndex -> Entry -> AbsoluteIndex -> IO ()
deleteRevIndex RevIndex
revIndex Entry
ent (AbsoluteIndex -> IO ()) -> AbsoluteIndex -> IO ()
forall a b. (a -> b) -> a -> b
$ Int -> AbsoluteIndex
AbsoluteIndex Int
ai
            Int -> Int -> Table -> Int -> IO ()
loop (Int
ai Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) Int
lim Table
table Int
maxN

tailDuplicationThreshold :: Int
tailDuplicationThreshold :: Int
tailDuplicationThreshold = Int
10

checkTailDuplication :: DynamicTable -> IO (Maybe AbsoluteIndex)
checkTailDuplication :: DynamicTable -> IO (Maybe AbsoluteIndex)
checkTailDuplication DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} = do
    dai :: AbsoluteIndex
dai@(AbsoluteIndex Int
ai) <- IORef AbsoluteIndex -> IO AbsoluteIndex
forall a. IORef a -> IO a
readIORef IORef AbsoluteIndex
droppingPoint
    IOArray Int Reference
arr <- IORef (IOArray Int Reference) -> IO (IOArray Int Reference)
forall a. IORef a -> IO a
readIORef IORef (IOArray Int Reference)
referenceCounters
    Int
maxN <- TVar Int -> IO Int
forall a. TVar a -> IO a
readTVarIO TVar Int
maxNumOfEntries
    let i :: Int
i = Int
ai Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
maxN
    -- modifyArray' is not provided by GHC 9.4 or earlier, sigh.
    Reference Int
current Int
total <- IOArray Int Reference -> Int -> IO Reference
forall i. Ix i => IOArray i Reference -> Int -> IO Reference
forall (a :: * -> * -> *) e (m :: * -> *) i.
(MArray a e m, Ix i) =>
a i e -> Int -> m e
unsafeRead IOArray Int Reference
arr Int
i
    if Int
current Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 Bool -> Bool -> Bool
&& Int
total Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
tailDuplicationThreshold
        then Maybe AbsoluteIndex -> IO (Maybe AbsoluteIndex)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe AbsoluteIndex -> IO (Maybe AbsoluteIndex))
-> Maybe AbsoluteIndex -> IO (Maybe AbsoluteIndex)
forall a b. (a -> b) -> a -> b
$ AbsoluteIndex -> Maybe AbsoluteIndex
forall a. a -> Maybe a
Just AbsoluteIndex
dai
        else Maybe AbsoluteIndex -> IO (Maybe AbsoluteIndex)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe AbsoluteIndex
forall a. Maybe a
Nothing
  where
    EncodeInfo{TVar Int
IORef Bool
IORef (IOArray Int Reference)
IORef (Set Int)
IORef (IntMap Section)
IORef RequiredInsertCount
IORef AbsoluteIndex
LRUCacheRef (FieldValue, FieldValue) ()
RevIndex
revIndex :: CodeInfo -> RevIndex
requiredInsertCount :: CodeInfo -> IORef RequiredInsertCount
droppingPoint :: CodeInfo -> IORef AbsoluteIndex
drainingPoint :: CodeInfo -> IORef AbsoluteIndex
knownReceivedCount :: CodeInfo -> TVar Int
referenceCounters :: CodeInfo -> IORef (IOArray Int Reference)
sections :: CodeInfo -> IORef (IntMap Section)
lruCache :: CodeInfo -> LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: CodeInfo -> IORef Bool
blockedStreamsE :: CodeInfo -> IORef (Set Int)
droppingPoint :: IORef AbsoluteIndex
referenceCounters :: IORef (IOArray Int Reference)
revIndex :: RevIndex
requiredInsertCount :: IORef RequiredInsertCount
drainingPoint :: IORef AbsoluteIndex
knownReceivedCount :: TVar Int
sections :: IORef (IntMap Section)
lruCache :: LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: IORef Bool
blockedStreamsE :: IORef (Set Int)
..} = CodeInfo
codeInfo

tailDuplication :: DynamicTable -> IO AbsoluteIndex
tailDuplication :: DynamicTable -> IO AbsoluteIndex
tailDuplication dyntbl :: DynamicTable
dyntbl@DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} = do
    AbsoluteIndex
dai <- IORef AbsoluteIndex -> IO AbsoluteIndex
forall a. IORef a -> IO a
readIORef IORef AbsoluteIndex
droppingPoint
    AbsoluteIndex
ndai <- DynamicTable -> AbsoluteIndex -> IO AbsoluteIndex
duplicate DynamicTable
dyntbl AbsoluteIndex
dai
    DynamicTable -> IO ()
dropIfNecessary DynamicTable
dyntbl
    AbsoluteIndex -> IO AbsoluteIndex
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return AbsoluteIndex
ndai
  where
    EncodeInfo{TVar Int
IORef Bool
IORef (IOArray Int Reference)
IORef (Set Int)
IORef (IntMap Section)
IORef RequiredInsertCount
IORef AbsoluteIndex
LRUCacheRef (FieldValue, FieldValue) ()
RevIndex
revIndex :: CodeInfo -> RevIndex
requiredInsertCount :: CodeInfo -> IORef RequiredInsertCount
droppingPoint :: CodeInfo -> IORef AbsoluteIndex
drainingPoint :: CodeInfo -> IORef AbsoluteIndex
knownReceivedCount :: CodeInfo -> TVar Int
referenceCounters :: CodeInfo -> IORef (IOArray Int Reference)
sections :: CodeInfo -> IORef (IntMap Section)
lruCache :: CodeInfo -> LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: CodeInfo -> IORef Bool
blockedStreamsE :: CodeInfo -> IORef (Set Int)
droppingPoint :: IORef AbsoluteIndex
revIndex :: RevIndex
requiredInsertCount :: IORef RequiredInsertCount
drainingPoint :: IORef AbsoluteIndex
knownReceivedCount :: TVar Int
referenceCounters :: IORef (IOArray Int Reference)
sections :: IORef (IntMap Section)
lruCache :: LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: IORef Bool
blockedStreamsE :: IORef (Set Int)
..} = CodeInfo
codeInfo

duplicate :: DynamicTable -> AbsoluteIndex -> IO AbsoluteIndex
duplicate :: DynamicTable -> AbsoluteIndex -> IO AbsoluteIndex
duplicate dyntbl :: DynamicTable
dyntbl@DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} (AbsoluteIndex Int
ai) = do
    Int
maxN <- TVar Int -> IO Int
forall a. TVar a -> IO a
readTVarIO TVar Int
maxNumOfEntries
    let i :: Int
i = Int
ai Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
maxN
    Table
table <- TVar Table -> IO Table
forall a. TVar a -> IO a
readTVarIO TVar Table
circularTable
    Entry
ent <- STM Entry -> IO Entry
forall a. STM a -> IO a
atomically (STM Entry -> IO Entry) -> STM Entry -> IO Entry
forall a b. (a -> b) -> a -> b
$ Table -> Int -> STM Entry
forall i. Ix i => TArray i Entry -> Int -> STM Entry
forall (a :: * -> * -> *) e (m :: * -> *) i.
(MArray a e m, Ix i) =>
a i e -> Int -> m e
unsafeRead Table
table Int
i
    Entry -> DynamicTable -> IO AbsoluteIndex
insertEntryToEncoder Entry
ent DynamicTable
dyntbl

----------------------------------------------------------------

canInsertEntry :: DynamicTable -> Entry -> Maybe AbsoluteIndex -> IO Bool
canInsertEntry :: DynamicTable -> Entry -> Maybe AbsoluteIndex -> IO Bool
canInsertEntry DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} Entry
ent Maybe AbsoluteIndex
mai = do
    let siz :: Int
siz = Entry -> Int
entrySize Entry
ent
    Int
tblsiz <- TVar Int -> IO Int
forall a. TVar a -> IO a
readTVarIO TVar Int
tableSize
    Int
maxtblsiz <- IORef Int -> IO Int
forall a. IORef a -> IO a
readIORef IORef Int
maxTableSize
    if Int
tblsiz Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
siz Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
maxtblsiz
        then
            Bool -> IO Bool
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True
        else do
            AbsoluteIndex Int
ai <- IORef AbsoluteIndex -> IO AbsoluteIndex
forall a. IORef a -> IO a
readIORef IORef AbsoluteIndex
droppingPoint
            InsertionPoint Int
lim <- TVar InsertionPoint -> IO InsertionPoint
forall a. TVar a -> IO a
readTVarIO TVar InsertionPoint
insertionPoint
            Int -> Int -> Int -> IO Bool
loop Int
ai Int
lim (Int
tblsiz Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
siz Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
maxtblsiz)
  where
    myself :: Int
myself = case Maybe AbsoluteIndex
mai of
        Maybe AbsoluteIndex
Nothing -> -Int
1 -- trick: this index does not exist
        Just (AbsoluteIndex Int
i) -> Int
i
    EncodeInfo{TVar Int
IORef Bool
IORef (IOArray Int Reference)
IORef (Set Int)
IORef (IntMap Section)
IORef RequiredInsertCount
IORef AbsoluteIndex
LRUCacheRef (FieldValue, FieldValue) ()
RevIndex
revIndex :: CodeInfo -> RevIndex
requiredInsertCount :: CodeInfo -> IORef RequiredInsertCount
droppingPoint :: CodeInfo -> IORef AbsoluteIndex
drainingPoint :: CodeInfo -> IORef AbsoluteIndex
knownReceivedCount :: CodeInfo -> TVar Int
referenceCounters :: CodeInfo -> IORef (IOArray Int Reference)
sections :: CodeInfo -> IORef (IntMap Section)
lruCache :: CodeInfo -> LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: CodeInfo -> IORef Bool
blockedStreamsE :: CodeInfo -> IORef (Set Int)
droppingPoint :: IORef AbsoluteIndex
revIndex :: RevIndex
requiredInsertCount :: IORef RequiredInsertCount
drainingPoint :: IORef AbsoluteIndex
knownReceivedCount :: TVar Int
referenceCounters :: IORef (IOArray Int Reference)
sections :: IORef (IntMap Section)
lruCache :: LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: IORef Bool
blockedStreamsE :: IORef (Set Int)
..} = CodeInfo
codeInfo
    loop :: Int -> Int -> Int -> IO Bool
loop Int
ai Int
lim Int
requiredSize
        | Int
requiredSize Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 = Bool -> IO Bool
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True
        | Bool
otherwise = do
            if Int
ai Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
lim Bool -> Bool -> Bool
&& Int
ai Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
myself -- don't drop the referred entry
                then do
                    Int
maxN <- TVar Int -> IO Int
forall a. TVar a -> IO a
readTVarIO TVar Int
maxNumOfEntries
                    let i :: Int
i = Int
ai Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
maxN
                    IOArray Int Reference
refs <- IORef (IOArray Int Reference) -> IO (IOArray Int Reference)
forall a. IORef a -> IO a
readIORef IORef (IOArray Int Reference)
referenceCounters
                    Reference Int
current Int
total <- IOArray Int Reference -> Int -> IO Reference
forall i. Ix i => IOArray i Reference -> Int -> IO Reference
forall (a :: * -> * -> *) e (m :: * -> *) i.
(MArray a e m, Ix i) =>
a i e -> Int -> m e
unsafeRead IOArray Int Reference
refs Int
i
                    if Int
current Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 Bool -> Bool -> Bool
&& Int
total Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
1
                        then do
                            Table
table <- TVar Table -> IO Table
forall a. TVar a -> IO a
readTVarIO TVar Table
circularTable
                            Entry
dent <- STM Entry -> IO Entry
forall a. STM a -> IO a
atomically (STM Entry -> IO Entry) -> STM Entry -> IO Entry
forall a b. (a -> b) -> a -> b
$ Table -> Int -> STM Entry
forall i. Ix i => TArray i Entry -> Int -> STM Entry
forall (a :: * -> * -> *) e (m :: * -> *) i.
(MArray a e m, Ix i) =>
a i e -> Int -> m e
unsafeRead Table
table Int
i
                            let siz :: Int
siz = Entry -> Int
entrySize Entry
dent

                            Int -> Int -> Int -> IO Bool
loop (Int
ai Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) Int
lim (Int
requiredSize Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
siz)
                        else Bool -> IO Bool
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
                else Bool -> IO Bool
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False

dropIfNecessary :: DynamicTable -> IO ()
dropIfNecessary :: DynamicTable -> IO ()
dropIfNecessary dyntbl :: DynamicTable
dyntbl@DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} = IO ()
loop
  where
    loop :: IO ()
loop = do
        Int
tblsize <- TVar Int -> IO Int
forall a. TVar a -> IO a
readTVarIO TVar Int
tableSize
        Int
maxtblsize <- IORef Int -> IO Int
forall a. IORef a -> IO a
readIORef IORef Int
maxTableSize
        Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (Int
tblsize Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
maxtblsize) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$ do
            Bool
dropped <- DynamicTable -> IO Bool
tryDrop DynamicTable
dyntbl
            if Bool
dropped then IO ()
loop else String -> IO ()
forall a. HasCallStack => String -> a
error String
"dropIfNecessary"

tryDrop :: DynamicTable -> IO Bool
tryDrop :: DynamicTable -> IO Bool
tryDrop dyntbl :: DynamicTable
dyntbl@DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} = do
    Int
maxN <- TVar Int -> IO Int
forall a. TVar a -> IO a
readTVarIO TVar Int
maxNumOfEntries
    dai :: AbsoluteIndex
dai@(AbsoluteIndex Int
ai) <- IORef AbsoluteIndex -> IO AbsoluteIndex
forall a. IORef a -> IO a
readIORef IORef AbsoluteIndex
droppingPoint
    InsertionPoint Int
lim <- TVar InsertionPoint -> IO InsertionPoint
forall a. TVar a -> IO a
readTVarIO TVar InsertionPoint
insertionPoint
    if Int
ai Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
lim
        then do
            let i :: Int
i = Int
ai Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
maxN
            IOArray Int Reference
refs <- IORef (IOArray Int Reference) -> IO (IOArray Int Reference)
forall a. IORef a -> IO a
readIORef IORef (IOArray Int Reference)
referenceCounters
            Reference Int
current Int
total <- IOArray Int Reference -> Int -> IO Reference
forall i. Ix i => IOArray i Reference -> Int -> IO Reference
forall (a :: * -> * -> *) e (m :: * -> *) i.
(MArray a e m, Ix i) =>
a i e -> Int -> m e
unsafeRead IOArray Int Reference
refs Int
i
            if Int
current Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 Bool -> Bool -> Bool
&& Int
total Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
1
                then do
                    Table
table <- TVar Table -> IO Table
forall a. TVar a -> IO a
readTVarIO TVar Table
circularTable
                    Entry
ent <- STM Entry -> IO Entry
forall a. STM a -> IO a
atomically (STM Entry -> IO Entry) -> STM Entry -> IO Entry
forall a b. (a -> b) -> a -> b
$ do
                        Entry
e <- Table -> Int -> STM Entry
forall i. Ix i => TArray i Entry -> Int -> STM Entry
forall (a :: * -> * -> *) e (m :: * -> *) i.
(MArray a e m, Ix i) =>
a i e -> Int -> m e
unsafeRead Table
table Int
i
                        Table -> Int -> Entry -> STM ()
forall i. Ix i => TArray i Entry -> Int -> Entry -> STM ()
forall (a :: * -> * -> *) e (m :: * -> *) i.
(MArray a e m, Ix i) =>
a i e -> Int -> e -> m ()
unsafeWrite Table
table Int
i Entry
dummyEntry
                        Entry -> STM Entry
forall a. a -> STM a
forall (m :: * -> *) a. Monad m => a -> m a
return Entry
e
                    let siz :: Int
siz = Entry -> Int
entrySize Entry
ent
                    STM () -> IO ()
forall a. STM a -> IO a
atomically (STM () -> IO ()) -> STM () -> IO ()
forall a b. (a -> b) -> a -> b
$ TVar Int -> (Int -> Int) -> STM ()
forall a. TVar a -> (a -> a) -> STM ()
modifyTVar' TVar Int
tableSize ((Int -> Int) -> STM ()) -> (Int -> Int) -> STM ()
forall a b. (a -> b) -> a -> b
$ Int -> Int -> Int
forall a. Num a => a -> a -> a
subtract Int
siz
                    IORef AbsoluteIndex -> (AbsoluteIndex -> AbsoluteIndex) -> IO ()
forall a. IORef a -> (a -> a) -> IO ()
modifyIORef' IORef AbsoluteIndex
droppingPoint (AbsoluteIndex -> AbsoluteIndex -> AbsoluteIndex
forall a. Num a => a -> a -> a
+ AbsoluteIndex
1)
                    DynamicTable -> IO () -> IO ()
qpackDebug DynamicTable
dyntbl (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$ do
                        String -> IO ()
putStrLn (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$
                            String
"DROPPED (AbsoluteIndex "
                                String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
ai
                                String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
") "
                                String -> ShowS
forall a. [a] -> [a] -> [a]
++ HeaderName -> String
forall a. Show a => a -> String
show (Entry -> HeaderName
entryHeaderName Entry
ent)
                                String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
" "
                                String -> ShowS
forall a. [a] -> [a] -> [a]
++ FieldValue -> String
forall a. Show a => a -> String
show (Entry -> FieldValue
entryFieldValue Entry
ent)
                        Int
tblsiz <- TVar Int -> IO Int
forall a. TVar a -> IO a
readTVarIO TVar Int
tableSize
                        String -> IO ()
putStrLn (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"    tblsiz: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
tblsiz
                    RevIndex -> Entry -> AbsoluteIndex -> IO ()
deleteRevIndex RevIndex
revIndex Entry
ent AbsoluteIndex
dai
                    Bool -> IO Bool
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True
                else Bool -> IO Bool
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
        else Bool -> IO Bool
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
  where
    EncodeInfo{TVar Int
IORef Bool
IORef (IOArray Int Reference)
IORef (Set Int)
IORef (IntMap Section)
IORef RequiredInsertCount
IORef AbsoluteIndex
LRUCacheRef (FieldValue, FieldValue) ()
RevIndex
revIndex :: CodeInfo -> RevIndex
requiredInsertCount :: CodeInfo -> IORef RequiredInsertCount
droppingPoint :: CodeInfo -> IORef AbsoluteIndex
drainingPoint :: CodeInfo -> IORef AbsoluteIndex
knownReceivedCount :: CodeInfo -> TVar Int
referenceCounters :: CodeInfo -> IORef (IOArray Int Reference)
sections :: CodeInfo -> IORef (IntMap Section)
lruCache :: CodeInfo -> LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: CodeInfo -> IORef Bool
blockedStreamsE :: CodeInfo -> IORef (Set Int)
droppingPoint :: IORef AbsoluteIndex
referenceCounters :: IORef (IOArray Int Reference)
revIndex :: RevIndex
requiredInsertCount :: IORef RequiredInsertCount
drainingPoint :: IORef AbsoluteIndex
knownReceivedCount :: TVar Int
sections :: IORef (IntMap Section)
lruCache :: LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: IORef Bool
blockedStreamsE :: IORef (Set Int)
..} = CodeInfo
codeInfo

----------------------------------------------------------------

getLruCache :: DynamicTable -> LRUCacheRef (FieldName, FieldValue) ()
getLruCache :: DynamicTable -> LRUCacheRef (FieldValue, FieldValue) ()
getLruCache DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} = LRUCacheRef (FieldValue, FieldValue) ()
lruCache
  where
    EncodeInfo{TVar Int
IORef Bool
IORef (IOArray Int Reference)
IORef (Set Int)
IORef (IntMap Section)
IORef RequiredInsertCount
IORef AbsoluteIndex
LRUCacheRef (FieldValue, FieldValue) ()
RevIndex
revIndex :: CodeInfo -> RevIndex
requiredInsertCount :: CodeInfo -> IORef RequiredInsertCount
droppingPoint :: CodeInfo -> IORef AbsoluteIndex
drainingPoint :: CodeInfo -> IORef AbsoluteIndex
knownReceivedCount :: CodeInfo -> TVar Int
referenceCounters :: CodeInfo -> IORef (IOArray Int Reference)
sections :: CodeInfo -> IORef (IntMap Section)
lruCache :: CodeInfo -> LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: CodeInfo -> IORef Bool
blockedStreamsE :: CodeInfo -> IORef (Set Int)
lruCache :: LRUCacheRef (FieldValue, FieldValue) ()
revIndex :: RevIndex
requiredInsertCount :: IORef RequiredInsertCount
droppingPoint :: IORef AbsoluteIndex
drainingPoint :: IORef AbsoluteIndex
knownReceivedCount :: TVar Int
referenceCounters :: IORef (IOArray Int Reference)
sections :: IORef (IntMap Section)
immediateAck :: IORef Bool
blockedStreamsE :: IORef (Set Int)
..} = CodeInfo
codeInfo

{-# INLINE getRevIndex #-}
getRevIndex :: DynamicTable -> RevIndex
getRevIndex :: DynamicTable -> RevIndex
getRevIndex DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} = RevIndex
revIndex
  where
    EncodeInfo{TVar Int
IORef Bool
IORef (IOArray Int Reference)
IORef (Set Int)
IORef (IntMap Section)
IORef RequiredInsertCount
IORef AbsoluteIndex
LRUCacheRef (FieldValue, FieldValue) ()
RevIndex
revIndex :: CodeInfo -> RevIndex
requiredInsertCount :: CodeInfo -> IORef RequiredInsertCount
droppingPoint :: CodeInfo -> IORef AbsoluteIndex
drainingPoint :: CodeInfo -> IORef AbsoluteIndex
knownReceivedCount :: CodeInfo -> TVar Int
referenceCounters :: CodeInfo -> IORef (IOArray Int Reference)
sections :: CodeInfo -> IORef (IntMap Section)
lruCache :: CodeInfo -> LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: CodeInfo -> IORef Bool
blockedStreamsE :: CodeInfo -> IORef (Set Int)
revIndex :: RevIndex
requiredInsertCount :: IORef RequiredInsertCount
droppingPoint :: IORef AbsoluteIndex
drainingPoint :: IORef AbsoluteIndex
knownReceivedCount :: TVar Int
referenceCounters :: IORef (IOArray Int Reference)
sections :: IORef (IntMap Section)
lruCache :: LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: IORef Bool
blockedStreamsE :: IORef (Set Int)
..} = CodeInfo
codeInfo

-- only for encoder instruction handler
getHuffmanDecoder :: DynamicTable -> HuffmanDecoder
getHuffmanDecoder :: DynamicTable -> HuffmanDecoder
getHuffmanDecoder DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} = HuffmanDecoder
huffmanDecoder
  where
    DecodeInfo{IORef Int
HuffmanDecoder
huffmanDecoder :: CodeInfo -> HuffmanDecoder
blockedStreamsD :: CodeInfo -> IORef Int
huffmanDecoder :: HuffmanDecoder
blockedStreamsD :: IORef Int
..} = CodeInfo
codeInfo

----------------------------------------------------------------

getMaxHeaderSize :: DynamicTable -> IO Int
getMaxHeaderSize :: DynamicTable -> IO Int
getMaxHeaderSize DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} = IORef Int -> IO Int
forall a. IORef a -> IO a
readIORef IORef Int
maxHeaderSize

setMaxHeaderSize :: DynamicTable -> Int -> IO ()
setMaxHeaderSize :: DynamicTable -> Int -> IO ()
setMaxHeaderSize DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} Int
n = IORef Int -> Int -> IO ()
forall a. IORef a -> a -> IO ()
writeIORef IORef Int
maxHeaderSize Int
n

----------------------------------------------------------------

qpackDebug :: DynamicTable -> IO () -> IO ()
qpackDebug :: DynamicTable -> IO () -> IO ()
qpackDebug DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} IO ()
action = do
    Bool
debug <- IORef Bool -> IO Bool
forall a. IORef a -> IO a
readIORef IORef Bool
debugQPACK
    Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when Bool
debug (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$ MVar () -> (() -> IO ()) -> IO ()
forall a b. MVar a -> (a -> IO b) -> IO b
withMVar MVar ()
stdoutLock ((() -> IO ()) -> IO ()) -> (() -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \()
_ -> IO ()
action

getDebugQPACK :: DynamicTable -> IO Bool
getDebugQPACK :: DynamicTable -> IO Bool
getDebugQPACK DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} = IORef Bool -> IO Bool
forall a. IORef a -> IO a
readIORef IORef Bool
debugQPACK

setDebugQPACK :: DynamicTable -> Bool -> IO ()
setDebugQPACK :: DynamicTable -> Bool -> IO ()
setDebugQPACK DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} Bool
b = IORef Bool -> Bool -> IO ()
forall a. IORef a -> a -> IO ()
writeIORef IORef Bool
debugQPACK Bool
b

{-# NOINLINE stdoutLock #-}
stdoutLock :: MVar ()
stdoutLock :: MVar ()
stdoutLock = IO (MVar ()) -> MVar ()
forall a. IO a -> a
unsafePerformIO (IO (MVar ()) -> MVar ()) -> IO (MVar ()) -> MVar ()
forall a b. (a -> b) -> a -> b
$ () -> IO (MVar ())
forall a. a -> IO (MVar a)
newMVar ()

printReferences :: DynamicTable -> IO ()
printReferences :: DynamicTable -> IO ()
printReferences DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} = do
    AbsoluteIndex Int
start <- IORef AbsoluteIndex -> IO AbsoluteIndex
forall a. IORef a -> IO a
readIORef IORef AbsoluteIndex
droppingPoint
    InsertionPoint Int
end <- TVar InsertionPoint -> IO InsertionPoint
forall a. TVar a -> IO a
readTVarIO TVar InsertionPoint
insertionPoint
    Int
maxN <- TVar Int -> IO Int
forall a. TVar a -> IO a
readTVarIO TVar Int
maxNumOfEntries
    IOArray Int Reference
arr <- IORef (IOArray Int Reference) -> IO (IOArray Int Reference)
forall a. IORef a -> IO a
readIORef IORef (IOArray Int Reference)
referenceCounters
    String -> IO ()
putStr String
"Refs: "
    Int -> Int -> IOArray Int Reference -> Int -> IO ()
loop Int
start Int
end IOArray Int Reference
arr Int
maxN
    String -> IO ()
putStr String
"\n"
  where
    loop :: Int -> Int -> IOArray Index Reference -> Int -> IO ()
    loop :: Int -> Int -> IOArray Int Reference -> Int -> IO ()
loop Int
start Int
end IOArray Int Reference
arr Int
maxN
        | Int
start Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
end = do
            Reference
r <- IOArray Int Reference -> Int -> IO Reference
forall i. Ix i => IOArray i Reference -> Int -> IO Reference
forall (a :: * -> * -> *) e (m :: * -> *) i.
(MArray a e m, Ix i) =>
a i e -> Int -> m e
unsafeRead IOArray Int Reference
arr (Int
start Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
maxN)
            String -> IO ()
putStr (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ Int -> String
forall a. Show a => a -> String
show Int
start String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
": " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Reference -> String
showReference Reference
r String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
", "
            Int -> Int -> IOArray Int Reference -> Int -> IO ()
loop (Int
start Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) Int
end IOArray Int Reference
arr Int
maxN
        | Bool
otherwise = () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
    EncodeInfo{TVar Int
IORef Bool
IORef (IOArray Int Reference)
IORef (Set Int)
IORef (IntMap Section)
IORef RequiredInsertCount
IORef AbsoluteIndex
LRUCacheRef (FieldValue, FieldValue) ()
RevIndex
revIndex :: CodeInfo -> RevIndex
requiredInsertCount :: CodeInfo -> IORef RequiredInsertCount
droppingPoint :: CodeInfo -> IORef AbsoluteIndex
drainingPoint :: CodeInfo -> IORef AbsoluteIndex
knownReceivedCount :: CodeInfo -> TVar Int
referenceCounters :: CodeInfo -> IORef (IOArray Int Reference)
sections :: CodeInfo -> IORef (IntMap Section)
lruCache :: CodeInfo -> LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: CodeInfo -> IORef Bool
blockedStreamsE :: CodeInfo -> IORef (Set Int)
droppingPoint :: IORef AbsoluteIndex
referenceCounters :: IORef (IOArray Int Reference)
revIndex :: RevIndex
requiredInsertCount :: IORef RequiredInsertCount
drainingPoint :: IORef AbsoluteIndex
knownReceivedCount :: TVar Int
sections :: IORef (IntMap Section)
lruCache :: LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: IORef Bool
blockedStreamsE :: IORef (Set Int)
..} = CodeInfo
codeInfo
    showReference :: Reference -> String
showReference (Reference Int
c Int
t) = Int -> String
forall a. Show a => a -> String
show Int
c String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"(" String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
t String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
")"

-- For decoder
checkHIndex :: DynamicTable -> HIndex -> IO ()
checkHIndex :: DynamicTable -> HIndex -> IO ()
checkHIndex DynamicTable
_ (SIndex AbsoluteIndex
_) = () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
checkHIndex DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} (DIndex (AbsoluteIndex Int
ai)) = do
    InsertionPoint Int
ip <- TVar InsertionPoint -> IO InsertionPoint
forall a. TVar a -> IO a
readTVarIO TVar InsertionPoint
insertionPoint
    Int
maxN <- TVar Int -> IO Int
forall a. TVar a -> IO a
readTVarIO TVar Int
maxNumOfEntries
    if Int
ip Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
maxN Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
ai Bool -> Bool -> Bool
&& Int
ai Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
ip
        then () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
        else String -> IO ()
forall a. HasCallStack => String -> a
error String
"checkHIndex"

-- For encoder
checkAbsoluteIndex :: DynamicTable -> AbsoluteIndex -> String -> IO ()
checkAbsoluteIndex :: DynamicTable -> AbsoluteIndex -> String -> IO ()
checkAbsoluteIndex DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} (AbsoluteIndex Int
ai) String
tag = do
    InsertionPoint Int
beg <- TVar InsertionPoint -> IO InsertionPoint
forall a. TVar a -> IO a
readTVarIO TVar InsertionPoint
insertionPoint
    AbsoluteIndex Int
end <- IORef AbsoluteIndex -> IO AbsoluteIndex
forall a. IORef a -> IO a
readIORef IORef AbsoluteIndex
droppingPoint
    Int
maxN <- TVar Int -> IO Int
forall a. TVar a -> IO a
readTVarIO TVar Int
maxNumOfEntries
    Table
table <- TVar Table -> IO Table
forall a. TVar a -> IO a
readTVarIO TVar Table
circularTable
    let calcSize :: Int -> Int -> IO Int
calcSize Int
i Int
acc
            | Int
i Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
beg = Int -> IO Int
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Int
acc
            | Bool
otherwise = do
                Int
siz <- Entry -> Int
entrySize (Entry -> Int) -> IO Entry -> IO Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> STM Entry -> IO Entry
forall a. STM a -> IO a
atomically (Table -> Int -> STM Entry
forall i. Ix i => TArray i Entry -> Int -> STM Entry
forall (a :: * -> * -> *) e (m :: * -> *) i.
(MArray a e m, Ix i) =>
a i e -> Int -> m e
unsafeRead Table
table (Int
i Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
maxN))
                Int -> Int -> IO Int
calcSize (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) (Int
acc Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
siz)
    if Int
end Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
ai Bool -> Bool -> Bool
&& Int
ai Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
beg
        then do
            Int
size <- Int -> Int -> IO Int
calcSize Int
end Int
0
            Int
size0 <- TVar Int -> IO Int
forall a. TVar a -> IO a
readTVarIO TVar Int
tableSize
            Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Int
size Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
size0) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$ String -> IO ()
forall a. HasCallStack => String -> a
error (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"checkAbsoluteIndex: size /= size0) " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
tag
            Int
lim <- IORef Int -> IO Int
forall a. IORef a -> IO a
readIORef IORef Int
maxTableSize
            Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Int
size Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
lim) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$ String -> IO ()
forall a. HasCallStack => String -> a
error (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"checkAbsoluteIndex: size > lim " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
tag
            String -> IO ()
putStrLn (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"    check: tblsiz: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
size String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
" " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
ai String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
" " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
tag
        else
            String -> IO ()
forall a. HasCallStack => String -> a
error (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$
                String
"checkAbsoluteIndex (3) "
                    String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
tag
                    String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
" <= "
                    String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
end
                    String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
" "
                    String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
ai
                    String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
" < "
                    String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
beg
  where
    EncodeInfo{TVar Int
IORef Bool
IORef (IOArray Int Reference)
IORef (Set Int)
IORef (IntMap Section)
IORef RequiredInsertCount
IORef AbsoluteIndex
LRUCacheRef (FieldValue, FieldValue) ()
RevIndex
revIndex :: CodeInfo -> RevIndex
requiredInsertCount :: CodeInfo -> IORef RequiredInsertCount
droppingPoint :: CodeInfo -> IORef AbsoluteIndex
drainingPoint :: CodeInfo -> IORef AbsoluteIndex
knownReceivedCount :: CodeInfo -> TVar Int
referenceCounters :: CodeInfo -> IORef (IOArray Int Reference)
sections :: CodeInfo -> IORef (IntMap Section)
lruCache :: CodeInfo -> LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: CodeInfo -> IORef Bool
blockedStreamsE :: CodeInfo -> IORef (Set Int)
droppingPoint :: IORef AbsoluteIndex
revIndex :: RevIndex
requiredInsertCount :: IORef RequiredInsertCount
drainingPoint :: IORef AbsoluteIndex
knownReceivedCount :: TVar Int
referenceCounters :: IORef (IOArray Int Reference)
sections :: IORef (IntMap Section)
lruCache :: LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: IORef Bool
blockedStreamsE :: IORef (Set Int)
..} = CodeInfo
codeInfo

----------------------------------------------------------------

getImmediateAck :: DynamicTable -> IO Bool
getImmediateAck :: DynamicTable -> IO Bool
getImmediateAck DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} = IORef Bool -> IO Bool
forall a. IORef a -> IO a
readIORef IORef Bool
immediateAck
  where
    EncodeInfo{TVar Int
IORef Bool
IORef (IOArray Int Reference)
IORef (Set Int)
IORef (IntMap Section)
IORef RequiredInsertCount
IORef AbsoluteIndex
LRUCacheRef (FieldValue, FieldValue) ()
RevIndex
revIndex :: CodeInfo -> RevIndex
requiredInsertCount :: CodeInfo -> IORef RequiredInsertCount
droppingPoint :: CodeInfo -> IORef AbsoluteIndex
drainingPoint :: CodeInfo -> IORef AbsoluteIndex
knownReceivedCount :: CodeInfo -> TVar Int
referenceCounters :: CodeInfo -> IORef (IOArray Int Reference)
sections :: CodeInfo -> IORef (IntMap Section)
lruCache :: CodeInfo -> LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: CodeInfo -> IORef Bool
blockedStreamsE :: CodeInfo -> IORef (Set Int)
immediateAck :: IORef Bool
revIndex :: RevIndex
requiredInsertCount :: IORef RequiredInsertCount
droppingPoint :: IORef AbsoluteIndex
drainingPoint :: IORef AbsoluteIndex
knownReceivedCount :: TVar Int
referenceCounters :: IORef (IOArray Int Reference)
sections :: IORef (IntMap Section)
lruCache :: LRUCacheRef (FieldValue, FieldValue) ()
blockedStreamsE :: IORef (Set Int)
..} = CodeInfo
codeInfo

setImmediateAck :: DynamicTable -> Bool -> IO ()
setImmediateAck :: DynamicTable -> Bool -> IO ()
setImmediateAck DynamicTable{TVar Int
TVar Table
TVar InsertionPoint
IORef Bool
IORef Int
IORef BasePoint
CodeInfo
FieldValue -> IO ()
sendIns :: DynamicTable -> FieldValue -> IO ()
codeInfo :: DynamicTable -> CodeInfo
insertionPoint :: DynamicTable -> TVar InsertionPoint
maxNumOfEntries :: DynamicTable -> TVar Int
circularTable :: DynamicTable -> TVar Table
basePoint :: DynamicTable -> IORef BasePoint
debugQPACK :: DynamicTable -> IORef Bool
capaReady :: DynamicTable -> IORef Bool
tableSize :: DynamicTable -> TVar Int
maxTableSize :: DynamicTable -> IORef Int
maxHeaderSize :: DynamicTable -> IORef Int
maxBlockedStreams :: DynamicTable -> IORef Int
codeInfo :: CodeInfo
insertionPoint :: TVar InsertionPoint
maxNumOfEntries :: TVar Int
circularTable :: TVar Table
basePoint :: IORef BasePoint
debugQPACK :: IORef Bool
capaReady :: IORef Bool
tableSize :: TVar Int
maxTableSize :: IORef Int
sendIns :: FieldValue -> IO ()
maxHeaderSize :: IORef Int
maxBlockedStreams :: IORef Int
..} Bool
b = IORef Bool -> Bool -> IO ()
forall a. IORef a -> a -> IO ()
writeIORef IORef Bool
immediateAck Bool
b
  where
    EncodeInfo{TVar Int
IORef Bool
IORef (IOArray Int Reference)
IORef (Set Int)
IORef (IntMap Section)
IORef RequiredInsertCount
IORef AbsoluteIndex
LRUCacheRef (FieldValue, FieldValue) ()
RevIndex
revIndex :: CodeInfo -> RevIndex
requiredInsertCount :: CodeInfo -> IORef RequiredInsertCount
droppingPoint :: CodeInfo -> IORef AbsoluteIndex
drainingPoint :: CodeInfo -> IORef AbsoluteIndex
knownReceivedCount :: CodeInfo -> TVar Int
referenceCounters :: CodeInfo -> IORef (IOArray Int Reference)
sections :: CodeInfo -> IORef (IntMap Section)
lruCache :: CodeInfo -> LRUCacheRef (FieldValue, FieldValue) ()
immediateAck :: CodeInfo -> IORef Bool
blockedStreamsE :: CodeInfo -> IORef (Set Int)
immediateAck :: IORef Bool
revIndex :: RevIndex
requiredInsertCount :: IORef RequiredInsertCount
droppingPoint :: IORef AbsoluteIndex
drainingPoint :: IORef AbsoluteIndex
knownReceivedCount :: TVar Int
referenceCounters :: IORef (IOArray Int Reference)
sections :: IORef (IntMap Section)
lruCache :: LRUCacheRef (FieldValue, FieldValue) ()
blockedStreamsE :: IORef (Set Int)
..} = CodeInfo
codeInfo