Index: content/browser/renderer_host/p2p/socket_host_tcp.cc |
diff --git a/content/browser/renderer_host/p2p/socket_host_tcp.cc b/content/browser/renderer_host/p2p/socket_host_tcp.cc |
index 2409280064138186706462c006ed81c2764d4fae..be59f72645186d4d98a60bb8245cf53a3dd5774d 100644 |
--- a/content/browser/renderer_host/p2p/socket_host_tcp.cc |
+++ b/content/browser/renderer_host/p2p/socket_host_tcp.cc |
@@ -87,10 +87,6 @@ void P2PSocketHostTcp::OnConnected(int result) { |
return; |
} |
- if (!socket_->SetSendBufferSize(kMaxSendBufferSize)) { |
- LOG(WARNING) << "Failed to set send buffer size for TCP socket."; |
- } |
- |
net::IPEndPoint address; |
result = socket_->GetLocalAddress(&address); |
if (result < 0) { |
@@ -196,16 +192,8 @@ void P2PSocketHostTcp::Send(const net::IPEndPoint& to, |
return; |
} |
- if (write_buffer_) { |
- // Silently drop packet if we haven't finished sending previous |
- // packet. |
- VLOG(1) << "Dropping TCP packet."; |
- return; |
- } |
- |
if (!(to == remote_address_)) { |
- // Renderer should use this socket only to send data to |
- // |remote_address_|. |
+ // Renderer should use this socket only to send data to |remote_address_|. |
NOTREACHED(); |
OnError(); |
return; |
@@ -223,51 +211,51 @@ void P2PSocketHostTcp::Send(const net::IPEndPoint& to, |
} |
int size = kPacketHeaderSize + data.size(); |
- write_buffer_ = new net::DrainableIOBuffer(new net::IOBuffer(size), size); |
- *reinterpret_cast<uint16*>(write_buffer_->data()) = |
- base::HostToNet16(data.size()); |
- memcpy(write_buffer_->data() + kPacketHeaderSize, &data[0], data.size()); |
+ scoped_refptr<net::DrainableIOBuffer> buffer = |
+ new net::DrainableIOBuffer(new net::IOBuffer(size), size); |
+ *reinterpret_cast<uint16*>(buffer->data()) = base::HostToNet16(data.size()); |
+ memcpy(buffer->data() + kPacketHeaderSize, &data[0], data.size()); |
+ if (write_buffer_) { |
+ write_queue_.push(buffer); |
+ return; |
+ } |
+ |
+ write_buffer_ = buffer; |
DoWrite(); |
} |
void P2PSocketHostTcp::DoWrite() { |
- while (true) { |
+ while (write_buffer_ && state_ == STATE_OPEN) { |
int result = socket_->Write(write_buffer_, write_buffer_->BytesRemaining(), |
base::Bind(&P2PSocketHostTcp::OnWritten, |
base::Unretained(this))); |
- if (result >= 0) { |
- write_buffer_->DidConsume(result); |
- if (write_buffer_->BytesRemaining() == 0) { |
- write_buffer_ = NULL; |
- break; |
- } |
- } else { |
- if (result != net::ERR_IO_PENDING) { |
- LOG(ERROR) << "Error when sending data in TCP socket: " << result; |
- OnError(); |
- } |
- break; |
- } |
+ HandleWriteResult(result); |
} |
} |
void P2PSocketHostTcp::OnWritten(int result) { |
- DCHECK(write_buffer_); |
DCHECK_NE(result, net::ERR_IO_PENDING); |
+ HandleWriteResult(result); |
+ DoWrite(); |
+} |
- if (result < 0) { |
- DCHECK(result != net::ERR_IO_PENDING); |
+void P2PSocketHostTcp::HandleWriteResult(int result) { |
+ DCHECK(write_buffer_); |
+ if (result >= 0) { |
+ write_buffer_->DidConsume(result); |
+ if (write_buffer_->BytesRemaining() == 0) { |
+ message_sender_->Send(new P2PMsg_OnSendComplete(id_)); |
+ if (write_queue_.empty()) { |
+ write_buffer_ = NULL; |
+ } else { |
+ write_buffer_ = write_queue_.front(); |
+ write_queue_.pop(); |
+ } |
+ } |
+ } else if (result != net::ERR_IO_PENDING) { |
LOG(ERROR) << "Error when sending data in TCP socket: " << result; |
OnError(); |
- return; |
- } |
- |
- write_buffer_->DidConsume(result); |
- if (write_buffer_->BytesRemaining() == 0) { |
- write_buffer_ = NULL; |
- } else { |
- DoWrite(); |
} |
} |