| 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);
|
| + }
|
| }
|
| }
|
|
|
|
|