Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(27)

Side by Side Diff: net/quic/chromium/quic_chromium_packet_writer.cc

Issue 2319343004: Makes migration on write error asynchronous to avoid reentrancy issues (Closed)
Patch Set: synced and rebased Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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"
11 #include "base/metrics/histogram_macros.h" 11 #include "base/metrics/histogram_macros.h"
12 #include "base/metrics/sparse_histogram.h" 12 #include "base/metrics/sparse_histogram.h"
13 #include "net/base/io_buffer.h" 13 #include "net/base/io_buffer.h"
14 #include "net/base/net_errors.h" 14 #include "net/base/net_errors.h"
15 #include "net/quic/chromium/quic_chromium_client_session.h" 15 #include "net/quic/chromium/quic_chromium_client_session.h"
16 16
17 namespace net { 17 namespace net {
18 18
19 QuicChromiumPacketWriter::QuicChromiumPacketWriter() : weak_factory_(this) {} 19 QuicChromiumPacketWriter::QuicChromiumPacketWriter() : weak_factory_(this) {}
20 20
21 QuicChromiumPacketWriter::QuicChromiumPacketWriter(Socket* socket) 21 QuicChromiumPacketWriter::QuicChromiumPacketWriter(Socket* socket)
22 : socket_(socket), 22 : socket_(socket),
23 delegate_(nullptr), 23 delegate_(nullptr),
24 packet_(nullptr), 24 packet_(nullptr),
25 write_blocked_(false), 25 write_blocked_(false),
26 weak_factory_(this) {} 26 weak_factory_(this) {}
27 27
28 QuicChromiumPacketWriter::~QuicChromiumPacketWriter() {} 28 QuicChromiumPacketWriter::~QuicChromiumPacketWriter() {}
29 29
30 int QuicChromiumPacketWriter::WritePacketToSocket(StringIOBuffer* packet) {
31 return socket_->Write(packet, packet->size(),
32 base::Bind(&QuicChromiumPacketWriter::OnWriteComplete,
33 weak_factory_.GetWeakPtr()));
34 }
35
36 WriteResult QuicChromiumPacketWriter::WritePacket( 30 WriteResult QuicChromiumPacketWriter::WritePacket(
37 const char* buffer, 31 const char* buffer,
38 size_t buf_len, 32 size_t buf_len,
39 const IPAddress& self_address, 33 const IPAddress& self_address,
40 const IPEndPoint& peer_address, 34 const IPEndPoint& peer_address,
41 PerPacketOptions* /*options*/) { 35 PerPacketOptions* /*options*/) {
42 scoped_refptr<StringIOBuffer> buf( 36 scoped_refptr<StringIOBuffer> buf(
43 new StringIOBuffer(std::string(buffer, buf_len))); 37 new StringIOBuffer(std::string(buffer, buf_len)));
44 DCHECK(!IsWriteBlocked()); 38 DCHECK(!IsWriteBlocked());
39 return WritePacketToSocket(buf);
40 }
41
42 WriteResult QuicChromiumPacketWriter::WritePacketToSocket(
43 scoped_refptr<StringIOBuffer> packet) {
45 base::TimeTicks now = base::TimeTicks::Now(); 44 base::TimeTicks now = base::TimeTicks::Now();
46 45 int rv = socket_->Write(packet.get(), packet.get()->size(),
47 int rv = WritePacketToSocket(buf.get()); 46 base::Bind(&QuicChromiumPacketWriter::OnWriteComplete,
47 weak_factory_.GetWeakPtr()));
48 48
49 if (rv < 0 && rv != ERR_IO_PENDING && delegate_ != nullptr) { 49 if (rv < 0 && rv != ERR_IO_PENDING && delegate_ != nullptr) {
50 // If write error, then call delegate's HandleWriteError, which 50 // If write error, then call delegate's HandleWriteError, which
51 // may be able to migrate and rewrite packet on a new socket. 51 // may be able to migrate and rewrite packet on a new socket.
52 // HandleWriteError returns the outcome of that rewrite attempt. 52 // HandleWriteError returns the outcome of that rewrite attempt.
53 rv = delegate_->HandleWriteError(rv, buf); 53 rv = delegate_->HandleWriteError(rv, packet);
54 } 54 }
55 55
56 WriteStatus status = WRITE_STATUS_OK; 56 WriteStatus status = WRITE_STATUS_OK;
57 if (rv < 0) { 57 if (rv < 0) {
58 if (rv != ERR_IO_PENDING) { 58 if (rv != ERR_IO_PENDING) {
59 UMA_HISTOGRAM_SPARSE_SLOWLY("Net.QuicSession.WriteError", -rv); 59 UMA_HISTOGRAM_SPARSE_SLOWLY("Net.QuicSession.WriteError", -rv);
60 status = WRITE_STATUS_ERROR; 60 status = WRITE_STATUS_ERROR;
61 } else { 61 } else {
62 status = WRITE_STATUS_BLOCKED; 62 status = WRITE_STATUS_BLOCKED;
63 write_blocked_ = true; 63 write_blocked_ = true;
64 packet_ = buf; 64 packet_ = packet;
65 } 65 }
66 } 66 }
67 67
68 base::TimeDelta delta = base::TimeTicks::Now() - now; 68 base::TimeDelta delta = base::TimeTicks::Now() - now;
69 if (status == WRITE_STATUS_OK) { 69 if (status == WRITE_STATUS_OK) {
70 UMA_HISTOGRAM_TIMES("Net.QuicSession.PacketWriteTime.Synchronous", delta); 70 UMA_HISTOGRAM_TIMES("Net.QuicSession.PacketWriteTime.Synchronous", delta);
71 } else if (status == WRITE_STATUS_BLOCKED) { 71 } else if (status == WRITE_STATUS_BLOCKED) {
72 UMA_HISTOGRAM_TIMES("Net.QuicSession.PacketWriteTime.Asynchronous", delta); 72 UMA_HISTOGRAM_TIMES("Net.QuicSession.PacketWriteTime.Asynchronous", delta);
73 } 73 }
74 74
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
108 else 108 else
109 delegate_->OnWriteUnblocked(); 109 delegate_->OnWriteUnblocked();
110 } 110 }
111 111
112 QuicByteCount QuicChromiumPacketWriter::GetMaxPacketSize( 112 QuicByteCount QuicChromiumPacketWriter::GetMaxPacketSize(
113 const IPEndPoint& peer_address) const { 113 const IPEndPoint& peer_address) const {
114 return kMaxPacketSize; 114 return kMaxPacketSize;
115 } 115 }
116 116
117 } // namespace net 117 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/chromium/quic_chromium_packet_writer.h ('k') | net/quic/chromium/quic_stream_factory.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698