Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(88)

Side by Side Diff: net/quic/core/packet_number_indexed_queue.h

Issue 2901773004: Landing Recent QUIC changes until May 20, 2017. (Closed)
Patch Set: Disable quic_restart_flag_quic_big_endian_connection_id_server until tests can be fixed. Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2017 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef NET_QUIC_CORE_PACKET_NUMBER_INDEXED_QUEUE_H_ 5 #ifndef NET_QUIC_CORE_PACKET_NUMBER_INDEXED_QUEUE_H_
6 #define NET_QUIC_CORE_PACKET_NUMBER_INDEXED_QUEUE_H_ 6 #define NET_QUIC_CORE_PACKET_NUMBER_INDEXED_QUEUE_H_
7 7
8 #include <deque> 8 #include <deque>
9 9
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 24 matching lines...) Expand all
35 // as one. 35 // as one.
36 template <typename T> 36 template <typename T>
37 class PacketNumberIndexedQueue { 37 class PacketNumberIndexedQueue {
38 public: 38 public:
39 PacketNumberIndexedQueue() 39 PacketNumberIndexedQueue()
40 : number_of_present_entries_(0), first_packet_(0) {} 40 : number_of_present_entries_(0), first_packet_(0) {}
41 41
42 // Retrieve the entry associated with the packet number. Returns the pointer 42 // Retrieve the entry associated with the packet number. Returns the pointer
43 // to the entry in case of success, or nullptr if the entry does not exist. 43 // to the entry in case of success, or nullptr if the entry does not exist.
44 T* GetEntry(QuicPacketNumber packet_number); 44 T* GetEntry(QuicPacketNumber packet_number);
45 const T* GetEntry(QuicPacketNumber packet_number) const;
45 46
46 // Inserts data associated |packet_number| into (or past) the end of the 47 // Inserts data associated |packet_number| into (or past) the end of the
47 // queue, filling up the missing intermediate entries as necessary. Returns 48 // queue, filling up the missing intermediate entries as necessary. Returns
48 // true if the element has been inserted successfully, false if it was already 49 // true if the element has been inserted successfully, false if it was already
49 // in the queue or inserted out of order. 50 // in the queue or inserted out of order.
50 template <typename... Args> 51 template <typename... Args>
51 bool Emplace(QuicPacketNumber packet_number, Args&&... args); 52 bool Emplace(QuicPacketNumber packet_number, Args&&... args);
52 53
53 // Removes data associated with |packet_number| and frees the slots in the 54 // Removes data associated with |packet_number| and frees the slots in the
54 // queue as necessary. 55 // queue as necessary.
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
87 EntryWrapper() : data(), present(false) {} 88 EntryWrapper() : data(), present(false) {}
88 89
89 template <typename... Args> 90 template <typename... Args>
90 explicit EntryWrapper(Args&&... args) 91 explicit EntryWrapper(Args&&... args)
91 : data(std::forward<Args>(args)...), present(true) {} 92 : data(std::forward<Args>(args)...), present(true) {}
92 }; 93 };
93 94
94 // Cleans up unused slots in the front after removing an element. 95 // Cleans up unused slots in the front after removing an element.
95 void Cleanup(); 96 void Cleanup();
96 97
97 EntryWrapper* GetEntryWrapper(QuicPacketNumber offset); 98 const EntryWrapper* GetEntryWrapper(QuicPacketNumber offset) const;
99 EntryWrapper* GetEntryWrapper(QuicPacketNumber offset) {
100 const auto* const_this = this;
101 return const_cast<EntryWrapper*>(const_this->GetEntryWrapper(offset));
102 }
98 103
99 std::deque<EntryWrapper> entries_; 104 std::deque<EntryWrapper> entries_;
100 size_t number_of_present_entries_; 105 size_t number_of_present_entries_;
101 QuicPacketNumber first_packet_; 106 QuicPacketNumber first_packet_;
102 }; 107 };
103 108
104 template <typename T> 109 template <typename T>
105 T* PacketNumberIndexedQueue<T>::GetEntry(QuicPacketNumber packet_number) { 110 T* PacketNumberIndexedQueue<T>::GetEntry(QuicPacketNumber packet_number) {
106 EntryWrapper* entry = GetEntryWrapper(packet_number); 111 EntryWrapper* entry = GetEntryWrapper(packet_number);
107 if (entry == nullptr) { 112 if (entry == nullptr) {
108 return nullptr; 113 return nullptr;
109 } 114 }
110 return &entry->data; 115 return &entry->data;
111 } 116 }
112 117
113 template <typename T> 118 template <typename T>
119 const T* PacketNumberIndexedQueue<T>::GetEntry(
120 QuicPacketNumber packet_number) const {
121 const EntryWrapper* entry = GetEntryWrapper(packet_number);
122 if (entry == nullptr) {
123 return nullptr;
124 }
125 return &entry->data;
126 }
127
128 template <typename T>
114 template <typename... Args> 129 template <typename... Args>
115 bool PacketNumberIndexedQueue<T>::Emplace(QuicPacketNumber packet_number, 130 bool PacketNumberIndexedQueue<T>::Emplace(QuicPacketNumber packet_number,
116 Args&&... args) { 131 Args&&... args) {
117 if (IsEmpty()) { 132 if (IsEmpty()) {
118 DCHECK(entries_.empty()); 133 DCHECK(entries_.empty());
119 DCHECK_EQ(0u, first_packet_); 134 DCHECK_EQ(0u, first_packet_);
120 135
121 entries_.emplace_back(std::forward<Args>(args)...); 136 entries_.emplace_back(std::forward<Args>(args)...);
122 number_of_present_entries_ = 1; 137 number_of_present_entries_ = 1;
123 first_packet_ = packet_number; 138 first_packet_ = packet_number;
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
161 while (!entries_.empty() && !entries_.front().present) { 176 while (!entries_.empty() && !entries_.front().present) {
162 entries_.pop_front(); 177 entries_.pop_front();
163 first_packet_++; 178 first_packet_++;
164 } 179 }
165 if (entries_.empty()) { 180 if (entries_.empty()) {
166 first_packet_ = 0; 181 first_packet_ = 0;
167 } 182 }
168 } 183 }
169 184
170 template <typename T> 185 template <typename T>
171 auto PacketNumberIndexedQueue<T>::GetEntryWrapper(QuicPacketNumber offset) 186 auto PacketNumberIndexedQueue<T>::GetEntryWrapper(QuicPacketNumber offset) const
172 -> EntryWrapper* { 187 -> const EntryWrapper* {
173 if (offset < first_packet_) { 188 if (offset < first_packet_) {
174 return nullptr; 189 return nullptr;
175 } 190 }
176 191
177 offset -= first_packet_; 192 offset -= first_packet_;
178 if (offset >= entries_.size()) { 193 if (offset >= entries_.size()) {
179 return nullptr; 194 return nullptr;
180 } 195 }
181 196
182 EntryWrapper* entry = &entries_[offset]; 197 const EntryWrapper* entry = &entries_[offset];
183 if (!entry->present) { 198 if (!entry->present) {
184 return nullptr; 199 return nullptr;
185 } 200 }
186 201
187 return entry; 202 return entry;
188 } 203 }
189 204
190 } // namespace net 205 } // namespace net
191 206
192 #endif // NET_QUIC_CORE_PACKET_NUMBER_INDEXED_QUEUE_H_ 207 #endif // NET_QUIC_CORE_PACKET_NUMBER_INDEXED_QUEUE_H_
OLDNEW
« no previous file with comments | « net/quic/core/congestion_control/bbr_sender.cc ('k') | net/quic/core/packet_number_indexed_queue_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698