Index: net/curvecp/messenger.cc |
diff --git a/net/curvecp/messenger.cc b/net/curvecp/messenger.cc |
index 07f7d82cf1843c482ddf85a62450f5f54c12ee57..7e0f1540675f27331e56cdc63855f833b26c8919 100644 |
--- a/net/curvecp/messenger.cc |
+++ b/net/curvecp/messenger.cc |
@@ -59,7 +59,7 @@ Messenger::Messenger(Packetizer* packetizer) |
: packetizer_(packetizer), |
send_buffer_(kSendBufferSize), |
send_complete_callback_(NULL), |
- receive_complete_callback_(NULL), |
+ old_receive_complete_callback_(NULL), |
pending_receive_length_(0), |
send_message_in_progress_(false), |
ALLOW_THIS_IN_INITIALIZER_LIST( |
@@ -72,7 +72,24 @@ Messenger::~Messenger() { |
int Messenger::Read(IOBuffer* buf, int buf_len, OldCompletionCallback* callback) { |
DCHECK(CalledOnValidThread()); |
- DCHECK(!receive_complete_callback_); |
+ DCHECK(!old_receive_complete_callback_); |
csilv
2011/12/07 00:03:48
change this to match line 91
James Hawkins
2011/12/07 00:19:37
Done.
|
+ |
+ if (!received_list_.bytes_available()) { |
+ old_receive_complete_callback_ = callback; |
+ pending_receive_ = buf; |
+ pending_receive_length_ = buf_len; |
+ return ERR_IO_PENDING; |
+ } |
+ |
+ int bytes_read = InternalRead(buf, buf_len); |
+ DCHECK_LT(0, bytes_read); |
+ return bytes_read; |
+} |
+int Messenger::Read(IOBuffer* buf, int buf_len, |
+ const CompletionCallback& callback) { |
+ DCHECK(CalledOnValidThread()); |
+ DCHECK(!old_receive_complete_callback_ && |
+ receive_complete_callback_.is_null()); |
if (!received_list_.bytes_available()) { |
receive_complete_callback_ = callback; |
@@ -338,12 +355,20 @@ void Messenger::RecvMessage() { |
} |
// If we have data available, and a read is pending, notify the callback. |
- if (received_list_.bytes_available() && receive_complete_callback_) { |
+ if (received_list_.bytes_available() && |
+ (old_receive_complete_callback_ || |
+ !receive_complete_callback_.is_null())) { |
// Pass the data up to the caller. |
int bytes_read = InternalRead(pending_receive_, pending_receive_length_); |
- OldCompletionCallback* callback = receive_complete_callback_; |
- receive_complete_callback_ = NULL; |
- callback->Run(bytes_read); |
+ if (old_receive_complete_callback_) { |
+ OldCompletionCallback* callback = old_receive_complete_callback_; |
+ old_receive_complete_callback_ = NULL; |
+ callback->Run(bytes_read); |
+ } else { |
+ CompletionCallback callback = receive_complete_callback_; |
+ receive_complete_callback_.Reset(); |
+ callback.Run(bytes_read); |
+ } |
} |
} |