Index: remoting/protocol/message_reader.cc |
diff --git a/remoting/protocol/message_reader.cc b/remoting/protocol/message_reader.cc |
index 441d7295b1dc4340fe5a8e5e17b388a52a87c41f..fbbe9be74bf1c0cdf23f47acdb8d513813344324 100644 |
--- a/remoting/protocol/message_reader.cc |
+++ b/remoting/protocol/message_reader.cc |
@@ -6,6 +6,7 @@ |
#include "base/bind.h" |
#include "base/callback.h" |
+#include "base/compiler_specific.h" |
#include "base/location.h" |
#include "base/thread_task_runner_handle.h" |
#include "net/base/io_buffer.h" |
@@ -23,11 +24,13 @@ MessageReader::MessageReader() |
: socket_(NULL), |
read_pending_(false), |
pending_messages_(0), |
- closed_(false) { |
+ closed_(false), |
+ ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) { |
} |
void MessageReader::Init(net::Socket* socket, |
const MessageReceivedCallback& callback) { |
+ DCHECK(CalledOnValidThread()); |
message_received_callback_ = callback; |
DCHECK(socket); |
socket_ = socket; |
@@ -39,18 +42,20 @@ MessageReader::~MessageReader() { |
} |
void MessageReader::DoRead() { |
+ DCHECK(CalledOnValidThread()); |
// Don't try to read again if there is another read pending or we |
// have messages that we haven't finished processing yet. |
while (!closed_ && !read_pending_ && pending_messages_ == 0) { |
read_buffer_ = new net::IOBuffer(kReadBufferSize); |
int result = socket_->Read( |
- read_buffer_, kReadBufferSize, base::Bind(&MessageReader::OnRead, |
- base::Unretained(this))); |
+ read_buffer_, kReadBufferSize, |
+ base::Bind(&MessageReader::OnRead, weak_factory_.GetWeakPtr())); |
HandleReadResult(result); |
} |
} |
void MessageReader::OnRead(int result) { |
+ DCHECK(CalledOnValidThread()); |
DCHECK(read_pending_); |
read_pending_ = false; |
@@ -61,6 +66,7 @@ void MessageReader::OnRead(int result) { |
} |
void MessageReader::HandleReadResult(int result) { |
+ DCHECK(CalledOnValidThread()); |
if (closed_) |
return; |
@@ -78,6 +84,7 @@ void MessageReader::HandleReadResult(int result) { |
} |
void MessageReader::OnDataReceived(net::IOBuffer* data, int data_size) { |
+ DCHECK(CalledOnValidThread()); |
message_decoder_.AddData(data, data_size); |
// Get list of all new messages first, and then call the callback |
@@ -96,27 +103,18 @@ void MessageReader::OnDataReceived(net::IOBuffer* data, int data_size) { |
it != new_messages.end(); ++it) { |
message_received_callback_.Run( |
scoped_ptr<CompoundBuffer>(*it), |
- base::Bind(&MessageReader::OnMessageDone, this, |
- base::ThreadTaskRunnerHandle::Get())); |
+ base::Bind(&MessageReader::OnMessageDone, |
+ weak_factory_.GetWeakPtr())); |
} |
} |
-void MessageReader::OnMessageDone( |
- scoped_refptr<base::SingleThreadTaskRunner> task_runner) { |
- if (task_runner->BelongsToCurrentThread()) { |
- ProcessDoneEvent(); |
- } else { |
- task_runner->PostTask( |
- FROM_HERE, base::Bind(&MessageReader::ProcessDoneEvent, this)); |
- } |
-} |
- |
-void MessageReader::ProcessDoneEvent() { |
+void MessageReader::OnMessageDone() { |
+ DCHECK(CalledOnValidThread()); |
pending_messages_--; |
DCHECK_GE(pending_messages_, 0); |
if (!read_pending_) |
- DoRead(); // Start next read if neccessary. |
+ DoRead(); // Start next read if necessary. |
} |
} // namespace protocol |