| Index: net/quic/quic_sent_packet_manager.cc
|
| diff --git a/net/quic/quic_sent_packet_manager.cc b/net/quic/quic_sent_packet_manager.cc
|
| index 748d6734d6dcc44a4227352075489adcc5aba763..bcdbc51c00d5b3722322cf886ea1daae5945ece0 100644
|
| --- a/net/quic/quic_sent_packet_manager.cc
|
| +++ b/net/quic/quic_sent_packet_manager.cc
|
| @@ -63,6 +63,39 @@ COMPILE_ASSERT(kHistoryPeriodMs >= kBitrateSmoothingPeriodMs,
|
|
|
| #define ENDPOINT (is_server_ ? "Server: " : " Client: ")
|
|
|
| +
|
| +QuicSentPacketManager::TransmissionInfo::TransmissionInfo()
|
| + : retransmittable_frames(NULL),
|
| + sequence_number_length(PACKET_1BYTE_SEQUENCE_NUMBER),
|
| + sent_time(QuicTime::Zero()),
|
| + all_transmissions(NULL),
|
| + pending(false) { }
|
| +
|
| +QuicSentPacketManager::TransmissionInfo::TransmissionInfo(
|
| + RetransmittableFrames* retransmittable_frames,
|
| + QuicPacketSequenceNumber sequence_number,
|
| + QuicSequenceNumberLength sequence_number_length)
|
| + : retransmittable_frames(retransmittable_frames),
|
| + sequence_number_length(sequence_number_length),
|
| + sent_time(QuicTime::Zero()),
|
| + all_transmissions(new SequenceNumberSet),
|
| + pending(false) {
|
| + all_transmissions->insert(sequence_number);
|
| +}
|
| +
|
| +QuicSentPacketManager::TransmissionInfo::TransmissionInfo(
|
| + RetransmittableFrames* retransmittable_frames,
|
| + QuicPacketSequenceNumber sequence_number,
|
| + QuicSequenceNumberLength sequence_number_length,
|
| + SequenceNumberSet* all_transmissions)
|
| + : retransmittable_frames(retransmittable_frames),
|
| + sequence_number_length(sequence_number_length),
|
| + sent_time(QuicTime::Zero()),
|
| + all_transmissions(all_transmissions),
|
| + pending(false) {
|
| + all_transmissions->insert(sequence_number);
|
| +}
|
| +
|
| QuicSentPacketManager::QuicSentPacketManager(bool is_server,
|
| const QuicClock* clock,
|
| QuicConnectionStats* stats,
|
| @@ -84,10 +117,9 @@ QuicSentPacketManager::~QuicSentPacketManager() {
|
| for (UnackedPacketMap::iterator it = unacked_packets_.begin();
|
| it != unacked_packets_.end(); ++it) {
|
| delete it->second.retransmittable_frames;
|
| - // Only delete previous_transmissions once, for the newest packet.
|
| - if (it->second.previous_transmissions != NULL &&
|
| - it->first == *it->second.previous_transmissions->rbegin()) {
|
| - delete it->second.previous_transmissions;
|
| + // Only delete all_transmissions once, for the newest packet.
|
| + if (it->first == *it->second.all_transmissions->rbegin()) {
|
| + delete it->second.all_transmissions;
|
| }
|
| }
|
| STLDeleteValues(&packet_history_map_);
|
| @@ -126,10 +158,12 @@ void QuicSentPacketManager::OnSerializedPacket(
|
| }
|
| }
|
|
|
| + QuicPacketSequenceNumber sequence_number = serialized_packet.sequence_number;
|
| DCHECK(unacked_packets_.empty() ||
|
| - unacked_packets_.rbegin()->first < serialized_packet.sequence_number);
|
| - unacked_packets_[serialized_packet.sequence_number] =
|
| + unacked_packets_.rbegin()->first < sequence_number);
|
| + unacked_packets_[sequence_number] =
|
| TransmissionInfo(serialized_packet.retransmittable_frames,
|
| + serialized_packet.sequence_number,
|
| serialized_packet.sequence_number_length);
|
| }
|
|
|
| @@ -157,21 +191,9 @@ void QuicSentPacketManager::OnRetransmittedPacket(
|
| // the retransmissions of it are acked.
|
| transmission_info->retransmittable_frames = NULL;
|
| unacked_packets_[new_sequence_number] =
|
| - TransmissionInfo(frames, transmission_info->sequence_number_length);
|
| -
|
| - // Keep track of all sequence numbers that this packet
|
| - // has been transmitted as.
|
| - SequenceNumberSet* previous_transmissions =
|
| - transmission_info->previous_transmissions;
|
| - if (previous_transmissions == NULL) {
|
| - // This is the first retransmission of this packet, so create a new entry.
|
| - previous_transmissions = new SequenceNumberSet;
|
| - transmission_info->previous_transmissions = previous_transmissions;
|
| - previous_transmissions->insert(old_sequence_number);
|
| - }
|
| - previous_transmissions->insert(new_sequence_number);
|
| - unacked_packets_[new_sequence_number].previous_transmissions =
|
| - previous_transmissions;
|
| + TransmissionInfo(frames, new_sequence_number,
|
| + transmission_info->sequence_number_length,
|
| + transmission_info->all_transmissions);
|
| }
|
|
|
| bool QuicSentPacketManager::OnIncomingAck(
|
| @@ -245,9 +267,8 @@ void QuicSentPacketManager::ClearPreviousRetransmissions(size_t num_to_clear) {
|
| // If this is not a previous transmission then there is no point
|
| // in clearing out any further packets, because it will not affect
|
| // the high water mark.
|
| - SequenceNumberSet* previous_transmissions =
|
| - it->second.previous_transmissions;
|
| - if (previous_transmissions == NULL) {
|
| + SequenceNumberSet* all_transmissions = it->second.all_transmissions;
|
| + if (all_transmissions->size() == 1) {
|
| if (it->second.retransmittable_frames == NULL) {
|
| // This is a current transmission, but a previous transmission has
|
| // been acked, so it's safe to remove.
|
| @@ -257,8 +278,7 @@ void QuicSentPacketManager::ClearPreviousRetransmissions(size_t num_to_clear) {
|
| }
|
| break;
|
| }
|
| - QuicPacketSequenceNumber newest_transmission =
|
| - *previous_transmissions->rbegin();
|
| + QuicPacketSequenceNumber newest_transmission = *all_transmissions->rbegin();
|
| if (sequence_number == newest_transmission) {
|
| break;
|
| }
|
| @@ -267,12 +287,9 @@ void QuicSentPacketManager::ClearPreviousRetransmissions(size_t num_to_clear) {
|
| }
|
|
|
| DCHECK(it->second.retransmittable_frames == NULL);
|
| - previous_transmissions->erase(sequence_number);
|
| - if (previous_transmissions->size() == 1) {
|
| - unacked_packets_[newest_transmission].previous_transmissions = NULL;
|
| - delete previous_transmissions;
|
| - }
|
| - unacked_packets_.erase(it++);
|
| + DCHECK_LT(1u, all_transmissions->size());
|
| + ++it;
|
| + RemovePacket(sequence_number);
|
| --num_to_clear;
|
| }
|
| }
|
| @@ -296,7 +313,7 @@ void QuicSentPacketManager::RetransmitUnackedPackets(
|
| unacked_it->second.retransmittable_frames;
|
| // Only mark it as handled if it can't be retransmitted and there are no
|
| // pending retransmissions which would be cleared.
|
| - if (frames == NULL && unacked_it->second.previous_transmissions == NULL &&
|
| + if (frames == NULL && unacked_it->second.all_transmissions->size() == 1 &&
|
| retransmission_type == ALL_PACKETS) {
|
| unacked_it = MarkPacketHandled(unacked_it->first, NOT_RECEIVED_BY_PEER);
|
| continue;
|
| @@ -387,15 +404,11 @@ QuicSentPacketManager::MarkPacketHandled(
|
| it->second.pending = false;
|
| }
|
|
|
| - SequenceNumberSet* previous_transmissions = it->second.previous_transmissions;
|
| - if (previous_transmissions == NULL) {
|
| - previous_transmissions = new SequenceNumberSet;
|
| - previous_transmissions->insert(sequence_number);
|
| - }
|
| - DCHECK(!previous_transmissions->empty());
|
| - SequenceNumberSet::reverse_iterator previous_transmissions_it =
|
| - previous_transmissions->rbegin();
|
| - QuicPacketSequenceNumber newest_transmission = *previous_transmissions_it;
|
| + SequenceNumberSet* all_transmissions = it->second.all_transmissions;
|
| + DCHECK(!all_transmissions->empty());
|
| + SequenceNumberSet::reverse_iterator all_transmissions_it =
|
| + all_transmissions->rbegin();
|
| + QuicPacketSequenceNumber newest_transmission = *all_transmissions_it;
|
| if (newest_transmission != sequence_number) {
|
| ++stats_->packets_spuriously_retransmitted;
|
| }
|
| @@ -405,8 +418,8 @@ QuicSentPacketManager::MarkPacketHandled(
|
| if (has_cryto_handshake) {
|
| --pending_crypto_packet_count_;
|
| }
|
| - while (previous_transmissions_it != previous_transmissions->rend()) {
|
| - QuicPacketSequenceNumber previous_transmission = *previous_transmissions_it;
|
| + while (all_transmissions_it != all_transmissions->rend()) {
|
| + QuicPacketSequenceNumber previous_transmission = *all_transmissions_it;
|
| TransmissionInfo* transmission_info =
|
| FindOrNull(unacked_packets_, previous_transmission);
|
| if (transmission_info->retransmittable_frames != NULL) {
|
| @@ -431,11 +444,12 @@ QuicSentPacketManager::MarkPacketHandled(
|
| if (!transmission_info->pending) {
|
| unacked_packets_.erase(previous_transmission);
|
| } else {
|
| - transmission_info->previous_transmissions = NULL;
|
| + transmission_info->all_transmissions = new SequenceNumberSet;
|
| + transmission_info->all_transmissions->insert(previous_transmission);
|
| }
|
| - ++previous_transmissions_it;
|
| + ++all_transmissions_it;
|
| }
|
| - delete previous_transmissions;
|
| + delete all_transmissions;
|
|
|
| UnackedPacketMap::iterator next_unacked = unacked_packets_.begin();
|
| while (next_unacked != unacked_packets_.end() &&
|
| @@ -445,6 +459,21 @@ QuicSentPacketManager::MarkPacketHandled(
|
| return next_unacked;
|
| }
|
|
|
| +void QuicSentPacketManager::RemovePacket(
|
| + QuicPacketSequenceNumber sequence_number) {
|
| + UnackedPacketMap::iterator it = unacked_packets_.find(sequence_number);
|
| + if (it == unacked_packets_.end()) {
|
| + LOG(DFATAL) << "packet is not unacked: " << sequence_number;
|
| + return;
|
| + }
|
| + const TransmissionInfo& transmission_info = it->second;
|
| + transmission_info.all_transmissions->erase(sequence_number);
|
| + if (transmission_info.all_transmissions->empty()) {
|
| + delete transmission_info.all_transmissions;
|
| + }
|
| + unacked_packets_.erase(it);
|
| +}
|
| +
|
| bool QuicSentPacketManager::IsUnacked(
|
| QuicPacketSequenceNumber sequence_number) const {
|
| return ContainsKey(unacked_packets_, sequence_number);
|
| @@ -514,7 +543,7 @@ bool QuicSentPacketManager::OnPacketSent(
|
| transmission_type,
|
| has_retransmittable_data)) {
|
| DCHECK(it->second.retransmittable_frames == NULL);
|
| - unacked_packets_.erase(it);
|
| + RemovePacket(sequence_number);
|
| // Do not reset the retransmission timer, since the packet isn't tracked.
|
| return false;
|
| }
|
| @@ -723,8 +752,8 @@ void QuicSentPacketManager::MaybeRetransmitOnAckFrame(
|
| // unacked_packets_. This is either the current transmission of
|
| // a packet whose previous transmission has been acked, or it
|
| // is a packet that has been TLP retransmitted.
|
| - RemovePreviousTransmission(sequence_number);
|
| - unacked_packets_.erase(it++);
|
| + ++it;
|
| + RemovePacket(sequence_number);
|
| }
|
| }
|
| }
|
| @@ -929,19 +958,4 @@ void QuicSentPacketManager::MaybeEnablePacing() {
|
| QuicTime::Delta::FromMicroseconds(1)));
|
| }
|
|
|
| -void QuicSentPacketManager::RemovePreviousTransmission(
|
| - QuicPacketSequenceNumber sequence_number) {
|
| - SequenceNumberSet* previous_transmissions =
|
| - unacked_packets_[sequence_number].previous_transmissions;
|
| - if (!previous_transmissions) {
|
| - return;
|
| - }
|
| - previous_transmissions->erase(sequence_number);
|
| - if (previous_transmissions->size() == 1) {
|
| - QuicPacketSequenceNumber current = *previous_transmissions->begin();
|
| - unacked_packets_[current].previous_transmissions = NULL;
|
| - delete previous_transmissions;
|
| - }
|
| -}
|
| -
|
| } // namespace net
|
|
|