| // Copyright 2025 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "quiche/quic/moqt/moqt_outstanding_objects.h" |
| |
| #include <cstddef> |
| |
| #include "quiche/quic/moqt/moqt_messages.h" |
| #include "quiche/common/platform/api/quiche_bug_tracker.h" |
| #include "quiche/common/platform/api/quiche_logging.h" |
| |
| namespace moqt { |
| |
| void MoqtOutstandingObjects::OnObjectAdded(Location location) { |
| objects_.push_back(OutstandingObject(location)); |
| location_map_.emplace(location, next_sequence_number_++); |
| while (objects_.size() > kMaxObjectsTracked) { |
| PopFront(); |
| } |
| } |
| |
| int MoqtOutstandingObjects::OnObjectAcked(Location location) { |
| auto it = location_map_.find(location); |
| if (it == location_map_.end()) { |
| // The relevant state has already been discarded. |
| return -1; |
| } |
| const SequenceNumber sequence_number = it->second; |
| const SequenceNumber offset = static_cast<SequenceNumber>(objects_.size()) + |
| sequence_number - next_sequence_number_; |
| if (offset < 0 || offset > objects_.size()) { |
| QUICHE_BUG(MoqtOutstandingObjects_BadOffset) |
| << "Invalid offset computed. Object list size: " << objects_.size() |
| << ", next sequence number: " << next_sequence_number_ |
| << ", sequence number: " << sequence_number; |
| return -1; |
| } |
| objects_[offset].acked = true; |
| |
| if (offset > max_out_of_order_objects_) { |
| for (SequenceNumber i = 0; i < offset - max_out_of_order_objects_; ++i) { |
| PopFront(); |
| } |
| } |
| while (!objects_.empty() && objects_.front().acked) { |
| PopFront(); |
| } |
| return offset; |
| } |
| |
| void MoqtOutstandingObjects::PopFront() { |
| QUICHE_DCHECK(!objects_.empty()); |
| location_map_.erase(objects_.front().location); |
| objects_.pop_front(); |
| } |
| |
| size_t MoqtOutstandingObjects::tracked_objects_count() const { |
| QUICHE_DCHECK_EQ(objects_.size(), location_map_.size()); |
| return objects_.size(); |
| } |
| |
| } // namespace moqt |