private EncoderHeaderEntry?RemoveHeaderEntry() { if (_headerTableSize == 0) { return(null); } EncoderHeaderEntry?eldest = Head.After; int hash = eldest.Hash; int bucketIndex = CalculateBucketIndex(hash); EncoderHeaderEntry?prev = _headerBuckets[bucketIndex]; EncoderHeaderEntry?e = prev; while (e != null) { EncoderHeaderEntry next = e.Next; if (e == eldest) { if (prev == eldest) { _headerBuckets[bucketIndex] = next; } else { prev.Next = next; } _headerTableSize -= eldest.CalculateSize(); eldest.Remove(); return(eldest); } prev = e; e = next; } return(null); }
/// <summary> /// Add before an entry in the linked list. /// </summary> public void AddBefore(EncoderHeaderEntry existingEntry) { After = existingEntry; Before = existingEntry.Before; Before !.After = this; After !.Before = this; }
private void PushRemovedEntry(EncoderHeaderEntry removed) { if (_removed != null) { removed.Next = _removed; } _removed = removed; }
/// <summary> /// Remove entry from the linked list and reset header values. /// </summary> public void Remove() { Before.After = After; After.Before = Before; Before = null; After = null; Next = null; Hash = 0; Name = null; Value = null; }
/// <summary> /// Initialize header values. An entry will be reinitialized when reused. /// </summary> public void Initialize(int hash, string name, string value, int index, EncoderHeaderEntry next) { Debug.Assert(name != null); Debug.Assert(value != null); Name = name; Value = value; Index = index; Hash = hash; Next = next; }
public HPackEncoder(bool allowDynamicCompression = true, uint maxHeaderTableSize = DefaultHeaderTableSize) { _allowDynamicCompression = allowDynamicCompression; _maxHeaderTableSize = maxHeaderTableSize; Head = new EncoderHeaderEntry(); Head.Initialize(-1, string.Empty, string.Empty, int.MaxValue, null); // Bucket count balances memory usage and the expected low number of headers (constrained by the header table size). // Performance with different bucket counts hasn't been measured in detail. _headerBuckets = new EncoderHeaderEntry[16]; _hashMask = (byte)(_headerBuckets.Length - 1); Head.Before = Head.After = Head; }