| 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..3a3b192064abc7859ca669cface84477ff5c39b9 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,32 +211,26 @@ 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);
|
| }
|
| }
|
|
|
| @@ -263,11 +245,25 @@ void P2PSocketHostTcp::OnWritten(int result) {
|
| return;
|
| }
|
|
|
| - write_buffer_->DidConsume(result);
|
| - if (write_buffer_->BytesRemaining() == 0) {
|
| - write_buffer_ = NULL;
|
| - } else {
|
| - DoWrite();
|
| + HandleWriteResult(result);
|
| + DoWrite();
|
| +}
|
| +
|
| +void P2PSocketHostTcp::HandleWriteResult(int result) {
|
| + 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();
|
| }
|
| }
|
|
|
|
|