OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/quic_session.h" | 5 #include "net/quic/quic_session.h" |
6 | 6 |
7 #include "base/stl_util.h" | 7 #include "base/stl_util.h" |
8 #include "net/quic/crypto/proof_verifier.h" | 8 #include "net/quic/crypto/proof_verifier.h" |
9 #include "net/quic/quic_connection.h" | 9 #include "net/quic/quic_connection.h" |
10 #include "net/quic/quic_flags.h" | 10 #include "net/quic/quic_flags.h" |
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
256 } | 256 } |
257 if (!connection_->CanWriteStreamData()) { | 257 if (!connection_->CanWriteStreamData()) { |
258 return; | 258 return; |
259 } | 259 } |
260 QuicStreamId stream_id = write_blocked_streams_.PopFront(); | 260 QuicStreamId stream_id = write_blocked_streams_.PopFront(); |
261 if (stream_id == kCryptoStreamId) { | 261 if (stream_id == kCryptoStreamId) { |
262 has_pending_handshake_ = false; // We just popped it. | 262 has_pending_handshake_ = false; // We just popped it. |
263 } | 263 } |
264 ReliableQuicStream* stream = GetStream(stream_id); | 264 ReliableQuicStream* stream = GetStream(stream_id); |
265 if (stream != nullptr && !stream->flow_controller()->IsBlocked()) { | 265 if (stream != nullptr && !stream->flow_controller()->IsBlocked()) { |
266 // If the stream can't write all bytes, it'll re-add itself to the blocked | 266 // If the stream can't write all bytes it'll re-add itself to the blocked |
267 // list. | 267 // list. |
268 stream->OnCanWrite(); | 268 stream->OnCanWrite(); |
269 } | 269 } |
270 } | 270 } |
271 } | 271 } |
272 | 272 |
273 bool QuicSession::WillingAndAbleToWrite() const { | 273 bool QuicSession::WillingAndAbleToWrite() const { |
274 // If the crypto or headers streams are blocked, we want to schedule a write - | 274 // If the crypto or headers streams are blocked, we want to schedule a write - |
275 // they don't get blocked by connection level flow control. Otherwise only | 275 // they don't get blocked by connection level flow control. Otherwise only |
276 // schedule a write if we are not flow control blocked at the connection | 276 // schedule a write if we are not flow control blocked at the connection |
(...skipping 11 matching lines...) Expand all Loading... |
288 return GetNumOpenStreams() > 0; | 288 return GetNumOpenStreams() > 0; |
289 } | 289 } |
290 | 290 |
291 QuicConsumedData QuicSession::WritevData( | 291 QuicConsumedData QuicSession::WritevData( |
292 QuicStreamId id, | 292 QuicStreamId id, |
293 QuicIOVector iov, | 293 QuicIOVector iov, |
294 QuicStreamOffset offset, | 294 QuicStreamOffset offset, |
295 bool fin, | 295 bool fin, |
296 FecProtection fec_protection, | 296 FecProtection fec_protection, |
297 QuicAckListenerInterface* ack_notifier_delegate) { | 297 QuicAckListenerInterface* ack_notifier_delegate) { |
298 return connection_->SendStreamData(id, iov, offset, fin, fec_protection, | 298 QuicConsumedData data = |
299 ack_notifier_delegate); | 299 connection_->SendStreamData(id, iov, offset, fin, fec_protection, |
| 300 ack_notifier_delegate); |
| 301 write_blocked_streams_.UpdateBytesForStream(id, data.bytes_consumed); |
| 302 return data; |
300 } | 303 } |
301 | 304 |
302 void QuicSession::SendRstStream(QuicStreamId id, | 305 void QuicSession::SendRstStream(QuicStreamId id, |
303 QuicRstStreamErrorCode error, | 306 QuicRstStreamErrorCode error, |
304 QuicStreamOffset bytes_written) { | 307 QuicStreamOffset bytes_written) { |
305 if (ContainsKey(static_stream_map_, id)) { | 308 if (ContainsKey(static_stream_map_, id)) { |
306 LOG(DFATAL) << "Cannot send RST for a static stream with ID " << id; | 309 LOG(DFATAL) << "Cannot send RST for a static stream with ID " << id; |
307 return; | 310 return; |
308 } | 311 } |
309 | 312 |
(...skipping 435 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
745 #endif | 748 #endif |
746 | 749 |
747 if (id == kCryptoStreamId) { | 750 if (id == kCryptoStreamId) { |
748 DCHECK(!has_pending_handshake_); | 751 DCHECK(!has_pending_handshake_); |
749 has_pending_handshake_ = true; | 752 has_pending_handshake_ = true; |
750 // TODO(jar): Be sure to use the highest priority for the crypto stream, | 753 // TODO(jar): Be sure to use the highest priority for the crypto stream, |
751 // perhaps by adding a "special" priority for it that is higher than | 754 // perhaps by adding a "special" priority for it that is higher than |
752 // kHighestPriority. | 755 // kHighestPriority. |
753 priority = kHighestPriority; | 756 priority = kHighestPriority; |
754 } | 757 } |
755 write_blocked_streams_.PushBack(id, priority); | 758 write_blocked_streams_.AddStream(id, priority); |
756 } | 759 } |
757 | 760 |
758 bool QuicSession::HasDataToWrite() const { | 761 bool QuicSession::HasDataToWrite() const { |
759 return write_blocked_streams_.HasWriteBlockedCryptoOrHeadersStream() || | 762 return write_blocked_streams_.HasWriteBlockedCryptoOrHeadersStream() || |
760 write_blocked_streams_.HasWriteBlockedDataStreams() || | 763 write_blocked_streams_.HasWriteBlockedDataStreams() || |
761 connection_->HasQueuedData(); | 764 connection_->HasQueuedData(); |
762 } | 765 } |
763 | 766 |
764 void QuicSession::PostProcessAfterData() { | 767 void QuicSession::PostProcessAfterData() { |
765 STLDeleteElements(&closed_streams_); | 768 STLDeleteElements(&closed_streams_); |
(...skipping 12 matching lines...) Expand all Loading... |
778 } | 781 } |
779 for (auto const& kv : dynamic_stream_map_) { | 782 for (auto const& kv : dynamic_stream_map_) { |
780 if (kv.second->flow_controller()->IsBlocked()) { | 783 if (kv.second->flow_controller()->IsBlocked()) { |
781 return true; | 784 return true; |
782 } | 785 } |
783 } | 786 } |
784 return false; | 787 return false; |
785 } | 788 } |
786 | 789 |
787 } // namespace net | 790 } // namespace net |
OLD | NEW |