コード例 #1
0
        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);
        }
コード例 #2
0
 /// <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;
 }
コード例 #3
0
 private void PushRemovedEntry(EncoderHeaderEntry removed)
 {
     if (_removed != null)
     {
         removed.Next = _removed;
     }
     _removed = removed;
 }
コード例 #4
0
 /// <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;
 }
コード例 #5
0
        /// <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;
        }
コード例 #6
0
 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;
 }