| Index: blimp/net/blimp_connection.cc
|
| diff --git a/blimp/net/blimp_connection.cc b/blimp/net/blimp_connection.cc
|
| index e8f3c68cc376131814ccd41bcf308c8950a2ce91..7b74c0a245d9d21f368c8b32d683905aec8db04c 100644
|
| --- a/blimp/net/blimp_connection.cc
|
| +++ b/blimp/net/blimp_connection.cc
|
| @@ -20,7 +20,6 @@
|
| #include "net/base/completion_callback.h"
|
|
|
| namespace blimp {
|
| -namespace {
|
|
|
| // Forwards incoming blimp messages to PacketWriter.
|
| class BlimpMessageSender : public BlimpMessageProcessor {
|
| @@ -33,6 +32,8 @@ class BlimpMessageSender : public BlimpMessageProcessor {
|
| }
|
|
|
| // BlimpMessageProcessor implementation.
|
| + // |callback| receives net::OK on write success, or receives an error code
|
| + // otherwise.
|
| void ProcessMessage(std::unique_ptr<BlimpMessage> message,
|
| const net::CompletionCallback& callback) override;
|
|
|
| @@ -91,28 +92,33 @@ void BlimpMessageSender::ProcessMessage(
|
| void BlimpMessageSender::OnWritePacketComplete(int result) {
|
| DVLOG(2) << "OnWritePacketComplete, result=" << result;
|
| DCHECK_NE(net::ERR_IO_PENDING, result);
|
| - base::ResetAndReturn(&pending_process_msg_callback_).Run(result);
|
| +
|
| + // Create a stack-local copy of |pending_process_msg_callback_|, in case an
|
| + // observer deletes |this|.
|
| + net::CompletionCallback process_callback =
|
| + base::ResetAndReturn(&pending_process_msg_callback_);
|
| +
|
| if (result != net::OK) {
|
| error_observer_->OnConnectionError(result);
|
| }
|
| -}
|
|
|
| -} // namespace
|
| + process_callback.Run(net::OK);
|
| +}
|
|
|
| BlimpConnection::BlimpConnection(std::unique_ptr<PacketReader> reader,
|
| std::unique_ptr<PacketWriter> writer)
|
| : reader_(std::move(reader)),
|
| message_pump_(new BlimpMessagePump(reader_.get())),
|
| - writer_(std::move(writer)),
|
| - outgoing_msg_processor_(new BlimpMessageSender(writer_.get())) {
|
| + writer_(std::move(writer)) {
|
| DCHECK(writer_);
|
| + DCHECK(reader_);
|
|
|
| - // Observe the connection errors received by any of this connection's network
|
| - // objects.
|
| message_pump_->set_error_observer(this);
|
| - BlimpMessageSender* sender =
|
| - static_cast<BlimpMessageSender*>(outgoing_msg_processor_.get());
|
| +
|
| + std::unique_ptr<BlimpMessageSender> sender(
|
| + new BlimpMessageSender(writer_.get()));
|
| sender->set_error_observer(this);
|
| + outgoing_msg_processor_ = std::move(sender);
|
| }
|
|
|
| BlimpConnection::BlimpConnection() {}
|
|
|