| Index: net/spdy/spdy_write_queue.cc
|
| diff --git a/net/spdy/spdy_write_queue.cc b/net/spdy/spdy_write_queue.cc
|
| index cc0d787eaf85b825509bb99268a5ec33c4355dd7..50df9440a777541ffcf4cbc66c45eb4f08243a02 100644
|
| --- a/net/spdy/spdy_write_queue.cc
|
| +++ b/net/spdy/spdy_write_queue.cc
|
| @@ -5,31 +5,33 @@
|
| #include "net/spdy/spdy_write_queue.h"
|
|
|
| #include <cstddef>
|
| +#include <utility>
|
| #include <vector>
|
|
|
| #include "base/logging.h"
|
| -#include "base/stl_util.h"
|
| #include "net/spdy/spdy_buffer.h"
|
| #include "net/spdy/spdy_buffer_producer.h"
|
| #include "net/spdy/spdy_stream.h"
|
|
|
| namespace net {
|
|
|
| -SpdyWriteQueue::PendingWrite::PendingWrite() : frame_producer(NULL) {}
|
| +SpdyWriteQueue::PendingWrite::PendingWrite() {}
|
|
|
| SpdyWriteQueue::PendingWrite::PendingWrite(
|
| SpdyFrameType frame_type,
|
| - SpdyBufferProducer* frame_producer,
|
| + std::unique_ptr<SpdyBufferProducer> frame_producer,
|
| const base::WeakPtr<SpdyStream>& stream)
|
| : frame_type(frame_type),
|
| - frame_producer(frame_producer),
|
| + frame_producer(std::move(frame_producer)),
|
| stream(stream),
|
| - has_stream(stream.get() != NULL) {}
|
| -
|
| -SpdyWriteQueue::PendingWrite::PendingWrite(const PendingWrite& other) = default;
|
| + has_stream(stream.get() != nullptr) {}
|
|
|
| SpdyWriteQueue::PendingWrite::~PendingWrite() {}
|
|
|
| +SpdyWriteQueue::PendingWrite::PendingWrite(PendingWrite&& other) = default;
|
| +SpdyWriteQueue::PendingWrite& SpdyWriteQueue::PendingWrite::operator=(
|
| + PendingWrite&& other) = default;
|
| +
|
| SpdyWriteQueue::SpdyWriteQueue() : removing_writes_(false) {}
|
|
|
| SpdyWriteQueue::~SpdyWriteQueue() {
|
| @@ -53,8 +55,7 @@ void SpdyWriteQueue::Enqueue(RequestPriority priority,
|
| CHECK_LE(priority, MAXIMUM_PRIORITY);
|
| if (stream.get())
|
| DCHECK_EQ(stream->priority(), priority);
|
| - queue_[priority].push_back(
|
| - PendingWrite(frame_type, frame_producer.release(), stream));
|
| + queue_[priority].push_back({frame_type, std::move(frame_producer), stream});
|
| }
|
|
|
| bool SpdyWriteQueue::Dequeue(
|
| @@ -64,10 +65,10 @@ bool SpdyWriteQueue::Dequeue(
|
| CHECK(!removing_writes_);
|
| for (int i = MAXIMUM_PRIORITY; i >= MINIMUM_PRIORITY; --i) {
|
| if (!queue_[i].empty()) {
|
| - PendingWrite pending_write = queue_[i].front();
|
| + PendingWrite pending_write = std::move(queue_[i].front());
|
| queue_[i].pop_front();
|
| *frame_type = pending_write.frame_type;
|
| - frame_producer->reset(pending_write.frame_producer);
|
| + *frame_producer = std::move(pending_write.frame_producer);
|
| *stream = pending_write.stream;
|
| if (pending_write.has_stream)
|
| DCHECK(stream->get());
|
| @@ -92,74 +93,66 @@ void SpdyWriteQueue::RemovePendingWritesForStream(
|
| for (int i = MINIMUM_PRIORITY; i <= MAXIMUM_PRIORITY; ++i) {
|
| if (priority == i)
|
| continue;
|
| - for (std::deque<PendingWrite>::const_iterator it = queue_[i].begin();
|
| - it != queue_[i].end(); ++it) {
|
| + for (auto it = queue_[i].begin(); it != queue_[i].end(); ++it)
|
| DCHECK_NE(it->stream.get(), stream.get());
|
| - }
|
| }
|
| #endif
|
|
|
| // Defer deletion until queue iteration is complete, as
|
| // SpdyBuffer::~SpdyBuffer() can result in callbacks into SpdyWriteQueue.
|
| - std::vector<SpdyBufferProducer*> erased_buffer_producers;
|
| + std::vector<std::unique_ptr<SpdyBufferProducer>> erased_buffer_producers;
|
|
|
| // Do the actual deletion and removal, preserving FIFO-ness.
|
| - std::deque<PendingWrite>* queue = &queue_[priority];
|
| - std::deque<PendingWrite>::iterator out_it = queue->begin();
|
| - for (std::deque<PendingWrite>::const_iterator it = queue->begin();
|
| - it != queue->end(); ++it) {
|
| + std::deque<PendingWrite>& queue = queue_[priority];
|
| + auto out_it = queue.begin();
|
| + for (auto it = queue.begin(); it != queue.end(); ++it) {
|
| if (it->stream.get() == stream.get()) {
|
| - erased_buffer_producers.push_back(it->frame_producer);
|
| + erased_buffer_producers.push_back(std::move(it->frame_producer));
|
| } else {
|
| - *out_it = *it;
|
| + *out_it = std::move(*it);
|
| ++out_it;
|
| }
|
| }
|
| - queue->erase(out_it, queue->end());
|
| + queue.erase(out_it, queue.end());
|
| removing_writes_ = false;
|
| - base::STLDeleteElements(&erased_buffer_producers); // Invokes callbacks.
|
| }
|
|
|
| void SpdyWriteQueue::RemovePendingWritesForStreamsAfter(
|
| SpdyStreamId last_good_stream_id) {
|
| CHECK(!removing_writes_);
|
| removing_writes_ = true;
|
| - std::vector<SpdyBufferProducer*> erased_buffer_producers;
|
| + std::vector<std::unique_ptr<SpdyBufferProducer>> erased_buffer_producers;
|
|
|
| for (int i = MINIMUM_PRIORITY; i <= MAXIMUM_PRIORITY; ++i) {
|
| // Do the actual deletion and removal, preserving FIFO-ness.
|
| - std::deque<PendingWrite>* queue = &queue_[i];
|
| - std::deque<PendingWrite>::iterator out_it = queue->begin();
|
| - for (std::deque<PendingWrite>::const_iterator it = queue->begin();
|
| - it != queue->end(); ++it) {
|
| + std::deque<PendingWrite>& queue = queue_[i];
|
| + auto out_it = queue.begin();
|
| + for (auto it = queue.begin(); it != queue.end(); ++it) {
|
| if (it->stream.get() && (it->stream->stream_id() > last_good_stream_id ||
|
| it->stream->stream_id() == 0)) {
|
| - erased_buffer_producers.push_back(it->frame_producer);
|
| + erased_buffer_producers.push_back(std::move(it->frame_producer));
|
| } else {
|
| - *out_it = *it;
|
| + *out_it = std::move(*it);
|
| ++out_it;
|
| }
|
| }
|
| - queue->erase(out_it, queue->end());
|
| + queue.erase(out_it, queue.end());
|
| }
|
| removing_writes_ = false;
|
| - base::STLDeleteElements(&erased_buffer_producers); // Invokes callbacks.
|
| }
|
|
|
| void SpdyWriteQueue::Clear() {
|
| CHECK(!removing_writes_);
|
| removing_writes_ = true;
|
| - std::vector<SpdyBufferProducer*> erased_buffer_producers;
|
| + std::vector<std::unique_ptr<SpdyBufferProducer>> erased_buffer_producers;
|
|
|
| for (int i = MINIMUM_PRIORITY; i <= MAXIMUM_PRIORITY; ++i) {
|
| - for (std::deque<PendingWrite>::iterator it = queue_[i].begin();
|
| - it != queue_[i].end(); ++it) {
|
| - erased_buffer_producers.push_back(it->frame_producer);
|
| + for (auto it = queue_[i].begin(); it != queue_[i].end(); ++it) {
|
| + erased_buffer_producers.push_back(std::move(it->frame_producer));
|
| }
|
| queue_[i].clear();
|
| }
|
| removing_writes_ = false;
|
| - base::STLDeleteElements(&erased_buffer_producers); // Invokes callbacks.
|
| }
|
|
|
| } // namespace net
|
|
|