Index: net/quic/quic_ack_notifier_manager.cc |
diff --git a/net/quic/quic_ack_notifier_manager.cc b/net/quic/quic_ack_notifier_manager.cc |
index 0d37752e211ab130f4ffcb9243ecf486e8f9ec1d..73e3c8e1c2ac87692fb8dc1e4256d95c67d7d9f8 100644 |
--- a/net/quic/quic_ack_notifier_manager.cc |
+++ b/net/quic/quic_ack_notifier_manager.cc |
@@ -20,7 +20,13 @@ namespace net { |
AckNotifierManager::AckNotifierManager() {} |
AckNotifierManager::~AckNotifierManager() { |
- STLDeleteElements(&ack_notifiers_); |
+ for (const auto& pair : ack_notifier_map_) { |
+ for (QuicAckNotifier* notifier : pair.second) { |
+ if (notifier->OnPacketAbandoned()) { |
+ delete notifier; |
+ } |
+ } |
+ } |
} |
void AckNotifierManager::OnPacketAcked(QuicPacketSequenceNumber sequence_number, |
@@ -34,14 +40,10 @@ void AckNotifierManager::OnPacketAcked(QuicPacketSequenceNumber sequence_number, |
// One or more AckNotifiers are registered as interested in this sequence |
// number. Iterate through them and call OnAck on each. |
- AckNotifierList& ack_notifier_list = map_it->second; |
- for (QuicAckNotifier* ack_notifier : ack_notifier_list) { |
- ack_notifier->OnAck(sequence_number, delta_largest_observed); |
- |
- // If this has resulted in an empty AckNotifer, erase it. |
- if (ack_notifier->IsEmpty()) { |
+ for (QuicAckNotifier* ack_notifier : map_it->second) { |
+ if (ack_notifier->OnAck(delta_largest_observed)) { |
+ // If this has resulted in an empty AckNotifer, erase it. |
delete ack_notifier; |
- ack_notifiers_.erase(ack_notifier); |
} |
} |
@@ -75,21 +77,19 @@ void AckNotifierManager::OnPacketRetransmitted( |
void AckNotifierManager::OnSerializedPacket( |
const SerializedPacket& serialized_packet) { |
if (FLAGS_quic_attach_ack_notifiers_to_packets) { |
- // Inform each attached AckNotifier of the packet's sequence number. |
+ // Inform each attached AckNotifier of the packet's serialization. |
+ AckNotifierList& notifier_list = |
+ ack_notifier_map_[serialized_packet.sequence_number]; |
for (QuicAckNotifier* notifier : serialized_packet.notifiers) { |
if (notifier == nullptr) { |
LOG(DFATAL) << "AckNotifier should not be nullptr."; |
continue; |
} |
- notifier->AddSequenceNumber(serialized_packet.sequence_number, |
- serialized_packet.packet->length()); |
+ notifier->OnSerializedPacket(); |
// Update the mapping in the other direction, from sequence number to |
// AckNotifier. |
- ack_notifier_map_[serialized_packet.sequence_number].push_back(notifier); |
- |
- // Take ownership of the AckNotifier. |
- ack_notifiers_.insert(notifier); |
+ notifier_list.push_back(notifier); |
} |
} else { |
// AckNotifiers can only be attached to retransmittable frames. |
@@ -107,15 +107,11 @@ void AckNotifierManager::OnSerializedPacket( |
} |
QuicAckNotifier* notifier = quic_frame.stream_frame->notifier; |
- notifier->AddSequenceNumber(serialized_packet.sequence_number, |
- serialized_packet.packet->length()); |
+ notifier->OnSerializedPacket(); |
// Update the mapping in the other direction, from sequence number to |
// AckNotifier. |
ack_notifier_map_[serialized_packet.sequence_number].push_back(notifier); |
- |
- // Take ownership of the AckNotifier. |
- ack_notifiers_.insert(notifier); |
} |
} |
} |