| Index: net/quic/quic_session.cc
|
| diff --git a/net/quic/quic_session.cc b/net/quic/quic_session.cc
|
| index 2a325d680a087dc95e36401f2292ee96cbbfb93f..0ef31694d3629c8285b4779aff5df6e15b457b4c 100644
|
| --- a/net/quic/quic_session.cc
|
| +++ b/net/quic/quic_session.cc
|
| @@ -19,6 +19,7 @@ using std::map;
|
| using std::max;
|
| using std::string;
|
| using std::vector;
|
| +using net::SpdyPriority;
|
|
|
| namespace net {
|
|
|
| @@ -112,8 +113,7 @@ QuicSession::QuicSession(QuicConnection* connection, const QuicConfig& config)
|
| perspective(),
|
| kMinimumFlowControlSendWindow,
|
| config_.GetInitialSessionFlowControlWindowToSend(),
|
| - false),
|
| - has_pending_handshake_(false) {}
|
| + false) {}
|
|
|
| void QuicSession::Initialize() {
|
| connection_->set_visitor(visitor_shim_.get());
|
| @@ -258,12 +258,9 @@ void QuicSession::OnCanWrite() {
|
| return;
|
| }
|
| QuicStreamId stream_id = write_blocked_streams_.PopFront();
|
| - if (stream_id == kCryptoStreamId) {
|
| - has_pending_handshake_ = false; // We just popped it.
|
| - }
|
| ReliableQuicStream* stream = GetStream(stream_id);
|
| if (stream != nullptr && !stream->flow_controller()->IsBlocked()) {
|
| - // If the stream can't write all bytes, it'll re-add itself to the blocked
|
| + // If the stream can't write all bytes it'll re-add itself to the blocked
|
| // list.
|
| stream->OnCanWrite();
|
| }
|
| @@ -281,7 +278,7 @@ bool QuicSession::WillingAndAbleToWrite() const {
|
| }
|
|
|
| bool QuicSession::HasPendingHandshake() const {
|
| - return has_pending_handshake_;
|
| + return write_blocked_streams_.crypto_stream_blocked();
|
| }
|
|
|
| bool QuicSession::HasOpenDynamicStreams() const {
|
| @@ -295,8 +292,10 @@ QuicConsumedData QuicSession::WritevData(
|
| bool fin,
|
| FecProtection fec_protection,
|
| QuicAckListenerInterface* ack_notifier_delegate) {
|
| - return connection_->SendStreamData(id, iov, offset, fin, fec_protection,
|
| - ack_notifier_delegate);
|
| + QuicConsumedData data = connection_->SendStreamData(
|
| + id, iov, offset, fin, fec_protection, ack_notifier_delegate);
|
| + write_blocked_streams_.UpdateBytesForStream(id, data.bytes_consumed);
|
| + return data;
|
| }
|
|
|
| void QuicSession::SendRstStream(QuicStreamId id,
|
| @@ -712,31 +711,18 @@ bool QuicSession::IsClosedStream(QuicStreamId id) {
|
| }
|
|
|
| size_t QuicSession::GetNumOpenStreams() const {
|
| - if (FLAGS_quic_count_unfinished_as_open_streams) {
|
| - if (FLAGS_allow_many_available_streams) {
|
| - return dynamic_stream_map_.size() - draining_streams_.size() +
|
| - locally_closed_streams_highest_offset_.size();
|
| - } else {
|
| - return dynamic_stream_map_.size() + available_streams_.size() -
|
| - draining_streams_.size() +
|
| - locally_closed_streams_highest_offset_.size();
|
| - }
|
| + if (FLAGS_allow_many_available_streams) {
|
| + return dynamic_stream_map_.size() - draining_streams_.size() +
|
| + locally_closed_streams_highest_offset_.size();
|
| } else {
|
| - if (FLAGS_allow_many_available_streams) {
|
| - return dynamic_stream_map_.size() - draining_streams_.size();
|
| - } else {
|
| - return dynamic_stream_map_.size() + available_streams_.size() -
|
| - draining_streams_.size();
|
| - }
|
| + return dynamic_stream_map_.size() + available_streams_.size() -
|
| + draining_streams_.size() +
|
| + locally_closed_streams_highest_offset_.size();
|
| }
|
| }
|
|
|
| size_t QuicSession::GetNumActiveStreams() const {
|
| - if (FLAGS_quic_count_unfinished_as_open_streams) {
|
| - return GetNumOpenStreams() - locally_closed_streams_highest_offset_.size();
|
| - } else {
|
| - return GetNumOpenStreams();
|
| - }
|
| + return GetNumOpenStreams() - locally_closed_streams_highest_offset_.size();
|
| }
|
|
|
| size_t QuicSession::GetNumAvailableStreams() const {
|
| @@ -744,28 +730,20 @@ size_t QuicSession::GetNumAvailableStreams() const {
|
| }
|
|
|
| void QuicSession::MarkConnectionLevelWriteBlocked(QuicStreamId id,
|
| - QuicPriority priority) {
|
| + SpdyPriority priority) {
|
| #ifndef NDEBUG
|
| ReliableQuicStream* stream = GetStream(id);
|
| if (stream != nullptr) {
|
| - LOG_IF(DFATAL, priority != stream->EffectivePriority())
|
| + LOG_IF(DFATAL, priority != stream->Priority())
|
| << ENDPOINT << "Stream " << id
|
| - << "Priorities do not match. Got: " << priority
|
| - << " Expected: " << stream->EffectivePriority();
|
| + << "Priorities do not match. Got: " << static_cast<int>(priority)
|
| + << " Expected: " << static_cast<int>(stream->Priority());
|
| } else {
|
| LOG(DFATAL) << "Marking unknown stream " << id << " blocked.";
|
| }
|
| #endif
|
|
|
| - if (id == kCryptoStreamId) {
|
| - DCHECK(!has_pending_handshake_);
|
| - has_pending_handshake_ = true;
|
| - // TODO(jar): Be sure to use the highest priority for the crypto stream,
|
| - // perhaps by adding a "special" priority for it that is higher than
|
| - // kHighestPriority.
|
| - priority = kHighestPriority;
|
| - }
|
| - write_blocked_streams_.PushBack(id, priority);
|
| + write_blocked_streams_.AddStream(id, priority);
|
| }
|
|
|
| bool QuicSession::HasDataToWrite() const {
|
| @@ -776,12 +754,7 @@ bool QuicSession::HasDataToWrite() const {
|
|
|
| void QuicSession::PostProcessAfterData() {
|
| STLDeleteElements(&closed_streams_);
|
| -
|
| - // A buggy client may fail to send FIN/RSTs. Don't tolerate this.
|
| - if (!FLAGS_quic_count_unfinished_as_open_streams &&
|
| - locally_closed_streams_highest_offset_.size() > max_open_streams_) {
|
| - CloseConnection(QUIC_TOO_MANY_UNFINISHED_STREAMS);
|
| - }
|
| + closed_streams_.clear();
|
| }
|
|
|
| bool QuicSession::IsConnectionFlowControlBlocked() const {
|
|
|