{-# LANGUAGE RecordWildCards #-}
{-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}
module Network.QPACK.Table.Dynamic (
DynamicTable,
newDynamicTableForEncoding,
newDynamicTableForDecoding,
isTableReady,
getTableCapacity,
setTableCapacity,
getMaxNumOfEntries,
insertEntryToDecoder,
insertEntryToEncoder,
toDynamicEntry,
Section (..),
insertSection,
getAndDelSection,
increaseReference,
decreaseReference,
getMaxBlockedStreams,
setMaxBlockedStreams,
tryIncreaseStreams,
decreaseStreams,
insertBlockedStreamE,
deleteBlockedStreamE,
checkBlockedStreams,
getRequiredInsertCount,
clearRequiredInsertCount,
checkRequiredInsertCount,
checkRequiredInsertCountNB,
updateRequiredInsertCount,
incrementKnownReceivedCount,
updateKnownReceivedCount,
wouldSectionBeBlocked,
wouldInstructionBeBlocked,
setInsersionPointToKnownReceivedCount,
getBasePoint,
setBasePointToInsersionPoint,
getInsertionPoint,
getInsertionPointSTM,
isDraining,
adjustDrainingPoint,
checkTailDuplication,
tailDuplication,
duplicate,
tryDrop,
canInsertEntry,
getLruCache,
getRevIndex,
getHuffmanDecoder,
sendIns,
getMaxHeaderSize,
setMaxHeaderSize,
qpackDebug,
getDebugQPACK,
setDebugQPACK,
printReferences,
checkHIndex,
checkAbsoluteIndex,
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
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)
data CodeInfo
= EncodeInfo
{ CodeInfo -> RevIndex
revIndex :: RevIndex
, 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
, CodeInfo -> IORef (Set Int)
blockedStreamsE :: IORef (Set Int)
}
| DecodeInfo
{ CodeInfo -> HuffmanDecoder
huffmanDecoder :: HuffmanDecoder
, CodeInfo -> IORef Int
blockedStreamsD :: IORef Int
}
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 ()
, :: IORef Int
, DynamicTable -> IORef Int
maxBlockedStreams :: IORef Int
}
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
newDynamicTableForDecoding
:: Size
-> (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
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
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
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
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
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
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
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
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
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
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 ()
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
")"
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"
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