Blocked decoding part 1: QpackHeaderTable::Observer. gfe-relnote: n/a, QUIC v99-only change. PiperOrigin-RevId: 257104083 Change-Id: I6209b6f2be59b32fba1790765a00abee7b75bfe2
diff --git a/quic/core/qpack/qpack_header_table.cc b/quic/core/qpack/qpack_header_table.cc index 0194330..9522666 100644 --- a/quic/core/qpack/qpack_header_table.cc +++ b/quic/core/qpack/qpack_header_table.cc
@@ -140,6 +140,14 @@ CHECK(result.second); } + // Notify and deregister observers whose threshold is met, if any. + while (!observers_.empty() && + observers_.top().required_insert_count <= inserted_entry_count()) { + Observer* observer = observers_.top().observer; + observers_.pop(); + observer->OnInsertCountReachedThreshold(); + } + return new_entry; } @@ -169,6 +177,17 @@ max_entries_ = maximum_dynamic_table_capacity / 32; } +void QpackHeaderTable::RegisterObserver(Observer* observer, + uint64_t required_insert_count) { + DCHECK_GT(required_insert_count, 0u); + observers_.push({observer, required_insert_count}); +} + +bool QpackHeaderTable::ObserverWithThreshold::operator>( + const ObserverWithThreshold& other) const { + return required_insert_count > other.required_insert_count; +} + void QpackHeaderTable::EvictDownToCurrentCapacity() { while (dynamic_table_size_ > dynamic_table_capacity_) { DCHECK(!dynamic_entries_.empty());