| Index: net/quic/quic_unacked_packet_map.cc
|
| diff --git a/net/quic/quic_unacked_packet_map.cc b/net/quic/quic_unacked_packet_map.cc
|
| index 330e74aac7b416ab5fc4b7b0e06e84c1c9619057..0640c29940c1a5d0d5415c39575b1fb450fd70a1 100644
|
| --- a/net/quic/quic_unacked_packet_map.cc
|
| +++ b/net/quic/quic_unacked_packet_map.cc
|
| @@ -27,7 +27,8 @@ QuicUnackedPacketMap::~QuicUnackedPacketMap() {
|
| it != unacked_packets_.end(); ++it, ++index) {
|
| delete it->retransmittable_frames;
|
| // Only delete all_transmissions once, for the newest packet.
|
| - if (index == *it->all_transmissions->rbegin()) {
|
| + if (it->all_transmissions != NULL &&
|
| + index == *it->all_transmissions->rbegin()) {
|
| delete it->all_transmissions;
|
| }
|
| }
|
| @@ -41,7 +42,6 @@ void QuicUnackedPacketMap::AddPacket(
|
| serialized_packet.sequence_number);
|
| unacked_packets_.push_back(
|
| TransmissionInfo(serialized_packet.retransmittable_frames,
|
| - serialized_packet.sequence_number,
|
| serialized_packet.sequence_number_length));
|
| if (serialized_packet.retransmittable_frames != NULL &&
|
| serialized_packet.retransmittable_frames->HasCryptoHandshake()
|
| @@ -82,7 +82,7 @@ void QuicUnackedPacketMap::OnRetransmittedPacket(
|
| transmission_info->retransmittable_frames = NULL;
|
| // Only keep one transmission older than largest observed, because only the
|
| // most recent is expected to possibly be a spurious retransmission.
|
| - if (transmission_info->all_transmissions->size() > 1 &&
|
| + if (transmission_info->all_transmissions != NULL &&
|
| *(++transmission_info->all_transmissions->begin()) < largest_observed_) {
|
| QuicPacketSequenceNumber old_transmission =
|
| *transmission_info->all_transmissions->begin();
|
| @@ -90,15 +90,18 @@ void QuicUnackedPacketMap::OnRetransmittedPacket(
|
| &unacked_packets_[old_transmission - least_unacked_];
|
| // Don't remove old packets if they're still in flight.
|
| if (!old_info->in_flight) {
|
| - transmission_info->all_transmissions->erase(old_transmission);
|
| + old_info->all_transmissions->pop_front();
|
| // This will cause the packet be removed in RemoveObsoletePackets.
|
| - old_info->all_transmissions = new SequenceNumberSet();
|
| - old_info->all_transmissions->insert(old_transmission);
|
| + old_info->all_transmissions = NULL;
|
| }
|
| }
|
| + if (transmission_info->all_transmissions == NULL) {
|
| + transmission_info->all_transmissions = new SequenceNumberList();
|
| + transmission_info->all_transmissions->push_back(old_sequence_number);
|
| + }
|
| + transmission_info->all_transmissions->push_back(new_sequence_number);
|
| unacked_packets_.push_back(
|
| TransmissionInfo(frames,
|
| - new_sequence_number,
|
| transmission_info->sequence_number_length,
|
| transmission_type,
|
| transmission_info->all_transmissions));
|
| @@ -114,7 +117,7 @@ void QuicUnackedPacketMap::ClearPreviousRetransmissions(size_t num_to_clear) {
|
| break;
|
| }
|
|
|
| - info->all_transmissions->erase(least_unacked_);
|
| + info->all_transmissions->pop_front();
|
| LOG_IF(DFATAL, info->all_transmissions->empty())
|
| << "Previous retransmissions must have a newer transmission.";
|
| unacked_packets_.pop_front();
|
| @@ -145,20 +148,19 @@ void QuicUnackedPacketMap::RemoveRetransmittability(
|
| DCHECK_GE(sequence_number, least_unacked_);
|
| DCHECK_LT(sequence_number, least_unacked_ + unacked_packets_.size());
|
| TransmissionInfo* info = &unacked_packets_[sequence_number - least_unacked_];
|
| - SequenceNumberSet* all_transmissions = info->all_transmissions;
|
| - if (all_transmissions->size() == 1) {
|
| + SequenceNumberList* all_transmissions = info->all_transmissions;
|
| + if (all_transmissions == NULL) {
|
| MaybeRemoveRetransmittableFrames(info);
|
| return;
|
| }
|
| // TODO(ianswett): Consider adding a check to ensure there are retransmittable
|
| // frames associated with this packet.
|
| - for (SequenceNumberSet::const_iterator it = all_transmissions->begin();
|
| + for (SequenceNumberList::const_iterator it = all_transmissions->begin();
|
| it != all_transmissions->end(); ++it) {
|
| TransmissionInfo* transmission_info =
|
| &unacked_packets_[*it - least_unacked_];
|
| MaybeRemoveRetransmittableFrames(transmission_info);
|
| - transmission_info->all_transmissions = new SequenceNumberSet();
|
| - transmission_info->all_transmissions->insert(*it);
|
| + transmission_info->all_transmissions = NULL;
|
| }
|
| delete all_transmissions;
|
| }
|
| @@ -187,7 +189,7 @@ bool QuicUnackedPacketMap::IsPacketUseless(
|
| return sequence_number <= largest_observed_ &&
|
| !info.in_flight &&
|
| info.retransmittable_frames == NULL &&
|
| - info.all_transmissions->size() == 1;
|
| + info.all_transmissions == NULL;
|
| }
|
|
|
| bool QuicUnackedPacketMap::IsUnacked(
|
|
|