| 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 66eea780f135d8f52a015d6f5d3fa6bce678e430..9ecb5a78736bc49701d89bda0640847afc6e5739 100644
|
| --- a/net/quic/quic_sent_packet_manager.cc
|
| +++ b/net/quic/quic_sent_packet_manager.cc
|
| @@ -32,7 +32,10 @@ QuicSentPacketManager::QuicSentPacketManager(bool is_server,
|
| }
|
|
|
| QuicSentPacketManager::~QuicSentPacketManager() {
|
| - STLDeleteValues(&unacked_packets_);
|
| + for (UnackedPacketMap::iterator it = unacked_packets_.begin();
|
| + it != unacked_packets_.end(); ++it) {
|
| + delete it->second.retransmittable_frames;
|
| + }
|
| while (!previous_transmissions_map_.empty()) {
|
| SequenceNumberSet* previous_transmissions =
|
| previous_transmissions_map_.begin()->second;
|
| @@ -62,34 +65,29 @@ void QuicSentPacketManager::OnSerializedPacket(
|
| ack_notifier_manager_.OnSerializedPacket(serialized_packet);
|
|
|
| DCHECK(unacked_packets_.empty() ||
|
| - unacked_packets_.rbegin()->first <
|
| - serialized_packet.sequence_number);
|
| + unacked_packets_.rbegin()->first < serialized_packet.sequence_number);
|
| unacked_packets_[serialized_packet.sequence_number] =
|
| - serialized_packet.retransmittable_frames;
|
| - retransmission_map_[serialized_packet.sequence_number] =
|
| - RetransmissionInfo(serialized_packet.sequence_number,
|
| - serialized_packet.sequence_number_length);
|
| + TransmissionInfo(serialized_packet.retransmittable_frames,
|
| + serialized_packet.sequence_number_length);
|
| + nack_map_[serialized_packet.sequence_number] = 0;
|
| }
|
|
|
| void QuicSentPacketManager::OnRetransmittedPacket(
|
| QuicPacketSequenceNumber old_sequence_number,
|
| QuicPacketSequenceNumber new_sequence_number) {
|
| DCHECK(ContainsKey(unacked_packets_, old_sequence_number));
|
| - DCHECK(ContainsKey(retransmission_map_, old_sequence_number));
|
| + DCHECK(ContainsKey(nack_map_, old_sequence_number));
|
| DCHECK(ContainsKey(pending_retransmissions_, old_sequence_number));
|
| DCHECK(unacked_packets_.empty() ||
|
| unacked_packets_.rbegin()->first < new_sequence_number);
|
|
|
| pending_retransmissions_.erase(old_sequence_number);
|
|
|
| - RetransmissionInfo retransmission_info(
|
| - new_sequence_number, GetSequenceNumberLength(old_sequence_number));
|
| - retransmission_info.number_retransmissions =
|
| - retransmission_map_[old_sequence_number].number_retransmissions + 1;
|
| - retransmission_map_.erase(old_sequence_number);
|
| - retransmission_map_[new_sequence_number] = retransmission_info;
|
| + nack_map_.erase(old_sequence_number);
|
| + nack_map_[new_sequence_number] = 0;
|
|
|
| - RetransmittableFrames* frames = unacked_packets_[old_sequence_number];
|
| + RetransmittableFrames* frames =
|
| + unacked_packets_[old_sequence_number].retransmittable_frames;
|
| DCHECK(frames);
|
|
|
| // A notifier may be waiting to hear about ACKs for the original sequence
|
| @@ -97,18 +95,12 @@ void QuicSentPacketManager::OnRetransmittedPacket(
|
| ack_notifier_manager_.UpdateSequenceNumber(old_sequence_number,
|
| new_sequence_number);
|
|
|
| - if (FLAGS_track_retransmission_history) {
|
| - // We keep the old packet in the unacked packet list until it, or one of
|
| - // the retransmissions of it are acked.
|
| - unacked_packets_[old_sequence_number] = NULL;
|
| - } else {
|
| - unacked_packets_.erase(old_sequence_number);
|
| - }
|
| - unacked_packets_[new_sequence_number] = frames;
|
| + // We keep the old packet in the unacked packet list until it, or one of
|
| + // the retransmissions of it are acked.
|
| + unacked_packets_[old_sequence_number].retransmittable_frames = NULL;
|
| + unacked_packets_[new_sequence_number] =
|
| + TransmissionInfo(frames, GetSequenceNumberLength(old_sequence_number));
|
|
|
| - if (!FLAGS_track_retransmission_history) {
|
| - return;
|
| - }
|
| // Keep track of all sequence numbers that this packet
|
| // has been transmitted as.
|
| SequenceNumberSet* previous_transmissions;
|
| @@ -176,13 +168,12 @@ void QuicSentPacketManager::HandleAckForSentPackets(
|
| // lowest unacked packet.
|
| DVLOG(1) << ENDPOINT << "still missing packet " << sequence_number;
|
| ++it;
|
| - RetransmissionMap::iterator retransmission_it =
|
| - retransmission_map_.find(sequence_number);
|
| - if (retransmission_it == retransmission_map_.end()) {
|
| + NackMap::iterator nack_it = nack_map_.find(sequence_number);
|
| + if (nack_it == nack_map_.end()) {
|
| continue;
|
| }
|
| - size_t nack_count = ++(retransmission_it->second.number_nacks);
|
| - helper_->OnPacketNacked(sequence_number, nack_count);
|
| + ++nack_it->second;
|
| + helper_->OnPacketNacked(sequence_number, nack_it->second);
|
| }
|
|
|
| // If we have received a trunacted ack, then we need to
|
| @@ -202,7 +193,7 @@ void QuicSentPacketManager::HandleAckForSentPackets(
|
| }
|
|
|
| DCHECK(ContainsKey(previous_transmissions_map_, sequence_number));
|
| - DCHECK(!ContainsKey(retransmission_map_, sequence_number));
|
| + DCHECK(!ContainsKey(nack_map_, sequence_number));
|
| DCHECK(!HasRetransmittableFrames(sequence_number));
|
| unacked_packets_.erase(sequence_number);
|
| SequenceNumberSet* previous_transmissions =
|
| @@ -224,7 +215,8 @@ bool QuicSentPacketManager::HasRetransmittableFrames(
|
| return false;
|
| }
|
|
|
| - return unacked_packets_.find(sequence_number)->second != NULL;
|
| + return unacked_packets_.find(
|
| + sequence_number)->second.retransmittable_frames != NULL;
|
| }
|
|
|
| bool QuicSentPacketManager::MarkForRetransmission(
|
| @@ -254,7 +246,7 @@ QuicSentPacketManager::PendingRetransmission
|
| QuicPacketSequenceNumber sequence_number =
|
| pending_retransmissions_.begin()->first;
|
| DCHECK(ContainsKey(unacked_packets_, sequence_number));
|
| - DCHECK(unacked_packets_[sequence_number]);
|
| + DCHECK(unacked_packets_[sequence_number].retransmittable_frames);
|
|
|
| return PendingRetransmission(sequence_number,
|
| pending_retransmissions_.begin()->second,
|
| @@ -324,8 +316,8 @@ QuicSentPacketManager::MarkPacketReceivedByPeer(
|
| // If we have received an ack for a previous transmission of a packet,
|
| // we want to keep the "new" transmission of the packet unacked,
|
| // but prevent the data from being retransmitted.
|
| - delete unacked_packets_[new_packet];
|
| - unacked_packets_[new_packet] = NULL;
|
| + delete unacked_packets_[new_packet].retransmittable_frames;
|
| + unacked_packets_[new_packet].retransmittable_frames = NULL;
|
| pending_retransmissions_.erase(new_packet);
|
| }
|
| previous_transmissions_map_.erase(new_packet);
|
| @@ -360,14 +352,14 @@ void QuicSentPacketManager::DiscardPacket(
|
| unacked_packets_.find(sequence_number);
|
| // Packet was not meant to be retransmitted.
|
| if (unacked_it == unacked_packets_.end()) {
|
| - DCHECK(!ContainsKey(retransmission_map_, sequence_number));
|
| + DCHECK(!ContainsKey(nack_map_, sequence_number));
|
| return;
|
| }
|
|
|
| - // Delete the unacked packet.
|
| - delete unacked_it->second;
|
| + // Delete the retransmittable frames.
|
| + delete unacked_it->second.retransmittable_frames;
|
| unacked_packets_.erase(unacked_it);
|
| - retransmission_map_.erase(sequence_number);
|
| + nack_map_.erase(sequence_number);
|
| pending_retransmissions_.erase(sequence_number);
|
| return;
|
| }
|
| @@ -404,19 +396,8 @@ void QuicSentPacketManager::DiscardFecPacket(
|
| bool QuicSentPacketManager::IsRetransmission(
|
| QuicPacketSequenceNumber sequence_number) const {
|
| DCHECK(HasRetransmittableFrames(sequence_number));
|
| - RetransmissionMap::const_iterator it =
|
| - retransmission_map_.find(sequence_number);
|
| - return it != retransmission_map_.end() &&
|
| - it->second.number_retransmissions > 0;
|
| -}
|
| -
|
| -size_t QuicSentPacketManager::GetRetransmissionCount(
|
| - QuicPacketSequenceNumber sequence_number) const {
|
| - DCHECK(HasRetransmittableFrames(sequence_number));
|
| - DCHECK(ContainsKey(retransmission_map_, sequence_number));
|
| - RetransmissionMap::const_iterator it =
|
| - retransmission_map_.find(sequence_number);
|
| - return it->second.number_retransmissions;
|
| + return HasRetransmittableFrames(sequence_number) &&
|
| + ContainsKey(previous_transmissions_map_, sequence_number);
|
| }
|
|
|
| bool QuicSentPacketManager::IsUnacked(
|
| @@ -432,18 +413,16 @@ bool QuicSentPacketManager::IsFecUnacked(
|
| const RetransmittableFrames& QuicSentPacketManager::GetRetransmittableFrames(
|
| QuicPacketSequenceNumber sequence_number) const {
|
| DCHECK(ContainsKey(unacked_packets_, sequence_number));
|
| - DCHECK(ContainsKey(retransmission_map_, sequence_number));
|
| + DCHECK(ContainsKey(nack_map_, sequence_number));
|
|
|
| - return *unacked_packets_.find(sequence_number)->second;
|
| + return *unacked_packets_.find(sequence_number)->second.retransmittable_frames;
|
| }
|
|
|
| QuicSequenceNumberLength QuicSentPacketManager::GetSequenceNumberLength(
|
| QuicPacketSequenceNumber sequence_number) const {
|
| DCHECK(ContainsKey(unacked_packets_, sequence_number));
|
| - DCHECK(ContainsKey(retransmission_map_, sequence_number));
|
|
|
| - return retransmission_map_.find(
|
| - sequence_number)->second.sequence_number_length;
|
| + return unacked_packets_.find(sequence_number)->second.sequence_number_length;
|
| }
|
|
|
| QuicTime QuicSentPacketManager::GetFecSentTime(
|
| @@ -457,8 +436,16 @@ bool QuicSentPacketManager::HasUnackedPackets() const {
|
| return !unacked_packets_.empty();
|
| }
|
|
|
| -size_t QuicSentPacketManager::GetNumUnackedPackets() const {
|
| - return unacked_packets_.size();
|
| +size_t QuicSentPacketManager::GetNumRetransmittablePackets() const {
|
| + size_t num_unacked_packets = 0;
|
| + for (UnackedPacketMap::const_iterator it = unacked_packets_.begin();
|
| + it != unacked_packets_.end(); ++it) {
|
| + QuicPacketSequenceNumber sequence_number = it->first;
|
| + if (HasRetransmittableFrames(sequence_number)) {
|
| + ++num_unacked_packets;
|
| + }
|
| + }
|
| + return num_unacked_packets;
|
| }
|
|
|
| bool QuicSentPacketManager::HasUnackedFecPackets() const {
|
|
|