| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/quic/chromium/quic_chromium_packet_writer.h" | 5 #include "net/quic/chromium/quic_chromium_packet_writer.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/location.h" | 9 #include "base/location.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 28 matching lines...) Expand all Loading... |
| 39 return WritePacketToSocket(buf); | 39 return WritePacketToSocket(buf); |
| 40 } | 40 } |
| 41 | 41 |
| 42 WriteResult QuicChromiumPacketWriter::WritePacketToSocket( | 42 WriteResult QuicChromiumPacketWriter::WritePacketToSocket( |
| 43 scoped_refptr<StringIOBuffer> packet) { | 43 scoped_refptr<StringIOBuffer> packet) { |
| 44 base::TimeTicks now = base::TimeTicks::Now(); | 44 base::TimeTicks now = base::TimeTicks::Now(); |
| 45 int rv = socket_->Write(packet.get(), packet.get()->size(), | 45 int rv = socket_->Write(packet.get(), packet.get()->size(), |
| 46 base::Bind(&QuicChromiumPacketWriter::OnWriteComplete, | 46 base::Bind(&QuicChromiumPacketWriter::OnWriteComplete, |
| 47 weak_factory_.GetWeakPtr())); | 47 weak_factory_.GetWeakPtr())); |
| 48 | 48 |
| 49 DLOG(INFO) << "socket returned: " << rv; |
| 49 if (rv < 0 && rv != ERR_IO_PENDING && delegate_ != nullptr) { | 50 if (rv < 0 && rv != ERR_IO_PENDING && delegate_ != nullptr) { |
| 50 // If write error, then call delegate's HandleWriteError, which | 51 // If write error, then call delegate's HandleWriteError, which |
| 51 // may be able to migrate and rewrite packet on a new socket. | 52 // may be able to migrate and rewrite packet on a new socket. |
| 52 // HandleWriteError returns the outcome of that rewrite attempt. | 53 // HandleWriteError returns the outcome of that rewrite attempt. |
| 53 rv = delegate_->HandleWriteError(rv, packet); | 54 rv = delegate_->HandleWriteError(rv, packet); |
| 54 } | 55 } |
| 55 | 56 |
| 56 WriteStatus status = WRITE_STATUS_OK; | 57 WriteStatus status = WRITE_STATUS_OK; |
| 57 if (rv < 0) { | 58 if (rv < 0) { |
| 58 if (rv != ERR_IO_PENDING) { | 59 if (rv != ERR_IO_PENDING) { |
| 59 UMA_HISTOGRAM_SPARSE_SLOWLY("Net.QuicSession.WriteError", -rv); | 60 UMA_HISTOGRAM_SPARSE_SLOWLY("Net.QuicSession.WriteError", -rv); |
| 60 status = WRITE_STATUS_ERROR; | 61 status = WRITE_STATUS_ERROR; |
| 61 } else { | 62 } else { |
| 63 DLOG(INFO) << "***async completion."; |
| 62 status = WRITE_STATUS_BLOCKED; | 64 status = WRITE_STATUS_BLOCKED; |
| 63 write_blocked_ = true; | 65 write_blocked_ = true; |
| 64 packet_ = packet; | 66 packet_ = packet; |
| 65 } | 67 } |
| 66 } | 68 } |
| 67 | 69 |
| 68 base::TimeDelta delta = base::TimeTicks::Now() - now; | 70 base::TimeDelta delta = base::TimeTicks::Now() - now; |
| 69 if (status == WRITE_STATUS_OK) { | 71 if (status == WRITE_STATUS_OK) { |
| 70 UMA_HISTOGRAM_TIMES("Net.QuicSession.PacketWriteTime.Synchronous", delta); | 72 UMA_HISTOGRAM_TIMES("Net.QuicSession.PacketWriteTime.Synchronous", delta); |
| 71 } else if (status == WRITE_STATUS_BLOCKED) { | 73 } else if (status == WRITE_STATUS_BLOCKED) { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 86 } | 88 } |
| 87 | 89 |
| 88 void QuicChromiumPacketWriter::SetWritable() { | 90 void QuicChromiumPacketWriter::SetWritable() { |
| 89 write_blocked_ = false; | 91 write_blocked_ = false; |
| 90 } | 92 } |
| 91 | 93 |
| 92 void QuicChromiumPacketWriter::OnWriteComplete(int rv) { | 94 void QuicChromiumPacketWriter::OnWriteComplete(int rv) { |
| 93 DCHECK_NE(rv, ERR_IO_PENDING); | 95 DCHECK_NE(rv, ERR_IO_PENDING); |
| 94 DCHECK(delegate_) << "Uninitialized delegate."; | 96 DCHECK(delegate_) << "Uninitialized delegate."; |
| 95 write_blocked_ = false; | 97 write_blocked_ = false; |
| 98 DLOG(INFO) << "Write completed asynchronously: " << rv; |
| 96 if (rv < 0) { | 99 if (rv < 0) { |
| 97 // If write error, then call delegate's HandleWriteError, which | 100 // If write error, then call delegate's HandleWriteError, which |
| 98 // may be able to migrate and rewrite packet on a new socket. | 101 // may be able to migrate and rewrite packet on a new socket. |
| 99 // HandleWriteError returns the outcome of that rewrite attempt. | 102 // HandleWriteError returns the outcome of that rewrite attempt. |
| 100 rv = delegate_->HandleWriteError(rv, packet_); | 103 rv = delegate_->HandleWriteError(rv, packet_); |
| 101 packet_ = nullptr; | 104 packet_ = nullptr; |
| 102 if (rv == ERR_IO_PENDING) | 105 if (rv == ERR_IO_PENDING) |
| 103 return; | 106 return; |
| 104 } | 107 } |
| 105 | 108 |
| 106 if (rv < 0) | 109 if (rv < 0) |
| 107 delegate_->OnWriteError(rv); | 110 delegate_->OnWriteError(rv); |
| 108 else | 111 else |
| 109 delegate_->OnWriteUnblocked(); | 112 delegate_->OnWriteUnblocked(); |
| 110 } | 113 } |
| 111 | 114 |
| 112 QuicByteCount QuicChromiumPacketWriter::GetMaxPacketSize( | 115 QuicByteCount QuicChromiumPacketWriter::GetMaxPacketSize( |
| 113 const IPEndPoint& peer_address) const { | 116 const IPEndPoint& peer_address) const { |
| 114 return kMaxPacketSize; | 117 return kMaxPacketSize; |
| 115 } | 118 } |
| 116 | 119 |
| 117 } // namespace net | 120 } // namespace net |
| OLD | NEW |