diff options
Diffstat (limited to 'remoting/protocol/buffered_socket_writer.cc')
-rw-r--r-- | remoting/protocol/buffered_socket_writer.cc | 64 |
1 files changed, 49 insertions, 15 deletions
diff --git a/remoting/protocol/buffered_socket_writer.cc b/remoting/protocol/buffered_socket_writer.cc index 0cf39bc..11b8395 100644 --- a/remoting/protocol/buffered_socket_writer.cc +++ b/remoting/protocol/buffered_socket_writer.cc @@ -5,11 +5,34 @@ #include "remoting/protocol/buffered_socket_writer.h" #include "base/message_loop.h" +#include "base/stl_util-inl.h" #include "net/base/net_errors.h" namespace remoting { namespace protocol { +class BufferedSocketWriterBase::PendingPacket { + public: + PendingPacket(scoped_refptr<net::IOBufferWithSize> data, Task* done_task) + : data_(data), + done_task_(done_task) { + } + ~PendingPacket() { + if (done_task_.get()) + done_task_->Run(); + } + + net::IOBufferWithSize* data() { + return data_; + } + + private: + scoped_refptr<net::IOBufferWithSize> data_; + scoped_ptr<Task> done_task_; + + DISALLOW_COPY_AND_ASSIGN(PendingPacket); +}; + BufferedSocketWriterBase::BufferedSocketWriterBase() : buffer_size_(0), socket_(NULL), @@ -32,11 +55,11 @@ void BufferedSocketWriterBase::Init(net::Socket* socket, } bool BufferedSocketWriterBase::Write( - scoped_refptr<net::IOBufferWithSize> data) { + scoped_refptr<net::IOBufferWithSize> data, Task* done_task) { AutoLock auto_lock(lock_); if (!socket_) return false; - queue_.push(data); + queue_.push_back(new PendingPacket(data, done_task)); buffer_size_ += data->size(); message_loop_->PostTask( FROM_HERE, NewRunnableMethod(this, &BufferedSocketWriterBase::DoWrite)); @@ -112,9 +135,7 @@ void BufferedSocketWriterBase::OnWritten(int result) { void BufferedSocketWriterBase::HandleError(int result) { AutoLock auto_lock(lock_); closed_ = true; - while (!queue_.empty()) { - queue_.pop(); - } + STLDeleteElements(&queue_); // Notify subclass that an error is received. OnError_Locked(result); @@ -135,19 +156,27 @@ void BufferedSocketWriterBase::Close() { closed_ = true; } +void BufferedSocketWriterBase::PopQueue() { + // This also calls |done_task|. + delete queue_.front(); + queue_.pop_front(); +} + BufferedSocketWriter::BufferedSocketWriter() { } -BufferedSocketWriter::~BufferedSocketWriter() { } + +BufferedSocketWriter::~BufferedSocketWriter() { + STLDeleteElements(&queue_); +} void BufferedSocketWriter::GetNextPacket_Locked( net::IOBuffer** buffer, int* size) { - while (!current_buf_ || current_buf_->BytesRemaining() == 0) { + if (!current_buf_) { if (queue_.empty()) { *buffer = NULL; return; // Nothing to write. } - current_buf_ = - new net::DrainableIOBuffer(queue_.front(), queue_.front()->size()); - queue_.pop(); + current_buf_ = new net::DrainableIOBuffer( + queue_.front()->data(), queue_.front()->data()->size()); } *buffer = current_buf_; @@ -157,6 +186,11 @@ void BufferedSocketWriter::GetNextPacket_Locked( void BufferedSocketWriter::AdvanceBufferPosition_Locked(int written) { buffer_size_ -= written; current_buf_->DidConsume(written); + + if (current_buf_->BytesRemaining() == 0) { + PopQueue(); + current_buf_ = NULL; + } } void BufferedSocketWriter::OnError_Locked(int result) { @@ -172,14 +206,14 @@ void BufferedDatagramWriter::GetNextPacket_Locked( *buffer = NULL; return; // Nothing to write. } - *buffer = queue_.front(); - *size = queue_.front()->size(); + *buffer = queue_.front()->data(); + *size = queue_.front()->data()->size(); } void BufferedDatagramWriter::AdvanceBufferPosition_Locked(int written) { - DCHECK_EQ(written, queue_.front()->size()); - buffer_size_ -= queue_.front()->size(); - queue_.pop(); + DCHECK_EQ(written, queue_.front()->data()->size()); + buffer_size_ -= queue_.front()->data()->size(); + PopQueue(); } void BufferedDatagramWriter::OnError_Locked(int result) { |