Index: blimp/net/stream_packet_reader.cc |
diff --git a/blimp/net/stream_packet_reader.cc b/blimp/net/stream_packet_reader.cc |
index 8da613020feaf66b7a840a186121379cbe6647cc..d8ac8350a74f506031ee650499855a50ab1be17c 100644 |
--- a/blimp/net/stream_packet_reader.cc |
+++ b/blimp/net/stream_packet_reader.cc |
@@ -9,6 +9,7 @@ |
#include "base/callback_helpers.h" |
#include "base/logging.h" |
#include "base/memory/weak_ptr.h" |
+#include "base/message_loop/message_loop.h" |
#include "base/sys_byteorder.h" |
#include "blimp/net/common.h" |
#include "net/base/io_buffer.h" |
@@ -42,7 +43,7 @@ StreamPacketReader::StreamPacketReader(net::StreamSocket* socket) |
StreamPacketReader::~StreamPacketReader() {} |
-int StreamPacketReader::ReadPacket( |
+void StreamPacketReader::ReadPacket( |
const scoped_refptr<net::GrowableIOBuffer>& buf, |
const net::CompletionCallback& callback) { |
DCHECK_EQ(ReadState::IDLE, read_state_); |
@@ -54,17 +55,17 @@ int StreamPacketReader::ReadPacket( |
read_state_ = ReadState::HEADER; |
int result = DoReadLoop(net::OK); |
- if (result == net::ERR_IO_PENDING) { |
- // Store the completion callback to invoke when read completes |
- // asynchronously. |
- callback_ = callback; |
- } else { |
+ if (result != net::ERR_IO_PENDING) { |
// Release the payload buffer, since the read operation has completed |
// synchronously. |
payload_buffer_ = nullptr; |
- } |
- return result; |
+ // Adapt synchronous completion to an asynchronous style. |
+ base::MessageLoop::current()->PostTask(FROM_HERE, |
+ base::Bind(callback, result)); |
+ } else { |
+ callback_ = callback; |
+ } |
} |
int StreamPacketReader::DoReadLoop(int result) { |