Chromium Code Reviews| Index: remoting/protocol/message_reader.cc |
| diff --git a/remoting/protocol/message_reader.cc b/remoting/protocol/message_reader.cc |
| index 441d7295b1dc4340fe5a8e5e17b388a52a87c41f..14fc5ead67d494c424a96cd3c334908f6aaac79e 100644 |
| --- a/remoting/protocol/message_reader.cc |
| +++ b/remoting/protocol/message_reader.cc |
| @@ -23,11 +23,13 @@ MessageReader::MessageReader() |
| : socket_(NULL), |
| read_pending_(false), |
| pending_messages_(0), |
| - closed_(false) { |
| + closed_(false), |
| + weak_ptr_factory_(this) { |
|
Wez
2012/08/23 01:18:58
ALLOW_THIS_IN_INITIALIZER() here?
Sergey Ulanov
2012/08/23 17:06:17
Done.
|
| } |
| void MessageReader::Init(net::Socket* socket, |
| const MessageReceivedCallback& callback) { |
| + DCHECK(CalledOnValidThread()); |
| message_received_callback_ = callback; |
| DCHECK(socket); |
| socket_ = socket; |
| @@ -39,18 +41,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_ptr_factory_.GetWeakPtr())); |
| HandleReadResult(result); |
| } |
| } |
| void MessageReader::OnRead(int result) { |
| + DCHECK(CalledOnValidThread()); |
| DCHECK(read_pending_); |
| read_pending_ = false; |
| @@ -61,6 +65,7 @@ void MessageReader::OnRead(int result) { |
| } |
| void MessageReader::HandleReadResult(int result) { |
| + DCHECK(CalledOnValidThread()); |
| if (closed_) |
| return; |
| @@ -78,6 +83,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 +102,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_ptr_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 |