Index: net/curvecp/messenger.cc |
diff --git a/net/curvecp/messenger.cc b/net/curvecp/messenger.cc |
index a99abda614d931246bb244582082badd035530a6..fc9adf5bc6c805eb73289fc0406b265c9c2fefd9 100644 |
--- a/net/curvecp/messenger.cc |
+++ b/net/curvecp/messenger.cc |
@@ -58,7 +58,7 @@ static const size_t kReceiveBufferSize = (128 * 1024); |
Messenger::Messenger(Packetizer* packetizer) |
: packetizer_(packetizer), |
send_buffer_(kSendBufferSize), |
- send_complete_callback_(NULL), |
+ old_send_complete_callback_(NULL), |
old_receive_complete_callback_(NULL), |
pending_receive_length_(0), |
send_message_in_progress_(false), |
@@ -104,10 +104,31 @@ int Messenger::Read(IOBuffer* buf, int buf_len, |
return bytes_read; |
} |
-int Messenger::Write(IOBuffer* buf, int buf_len, OldCompletionCallback* callback) { |
+int Messenger::Write( |
+ IOBuffer* buf, int buf_len, OldCompletionCallback* callback) { |
DCHECK(CalledOnValidThread()); |
DCHECK(!pending_send_.get()); // Already a write pending! |
- DCHECK(!send_complete_callback_); |
+ DCHECK(!old_send_complete_callback_ && send_complete_callback_.is_null()); |
+ DCHECK_LT(0, buf_len); |
+ |
+ int len = send_buffer_.write(buf->data(), buf_len); |
+ if (!send_timer_.IsRunning()) |
+ send_timer_.Start(FROM_HERE, base::TimeDelta(), |
+ this, &Messenger::OnSendTimer); |
+ if (len) |
+ return len; |
+ |
+ // We couldn't add data to the send buffer, so block the application. |
+ pending_send_ = buf; |
+ pending_send_length_ = buf_len; |
+ old_send_complete_callback_ = callback; |
+ return ERR_IO_PENDING; |
+} |
+int Messenger::Write( |
+ IOBuffer* buf, int buf_len, const CompletionCallback& callback) { |
+ DCHECK(CalledOnValidThread()); |
+ DCHECK(!pending_send_.get()); // Already a write pending! |
+ DCHECK(!old_send_complete_callback_ && send_complete_callback_.is_null()); |
DCHECK_LT(0, buf_len); |
int len = send_buffer_.write(buf->data(), buf_len); |
@@ -168,15 +189,21 @@ IOBufferWithSize* Messenger::CreateBufferFromSendQueue() { |
DCHECK_EQ(bytes, length); |
// We consumed data, check to see if someone is waiting to write more data. |
- if (send_complete_callback_) { |
+ if (old_send_complete_callback_ || !send_complete_callback_.is_null()) { |
DCHECK(pending_send_.get()); |
int len = send_buffer_.write(pending_send_->data(), pending_send_length_); |
if (len) { |
pending_send_ = NULL; |
- OldCompletionCallback* callback = send_complete_callback_; |
- send_complete_callback_ = NULL; |
- callback->Run(len); |
+ if (old_send_complete_callback_) { |
+ OldCompletionCallback* callback = old_send_complete_callback_; |
+ old_send_complete_callback_ = NULL; |
+ callback->Run(len); |
+ } else { |
+ CompletionCallback callback = send_complete_callback_; |
+ send_complete_callback_.Reset(); |
+ callback.Run(len); |
+ } |
} |
} |