forked from quic-go/quic-go
don't use closures for passing OnLost and OnAcked STREAM frame callbacks (#3833)
This commit is contained in:
@@ -27,3 +27,11 @@ func putFrame(f *Frame) {
|
||||
f.OnAcked = nil
|
||||
framePool.Put(f)
|
||||
}
|
||||
|
||||
type StreamFrame struct {
|
||||
Frame *wire.StreamFrame
|
||||
Handler interface {
|
||||
OnLost(*wire.StreamFrame)
|
||||
OnAcked(*wire.StreamFrame)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ import (
|
||||
type Packet struct {
|
||||
SendTime time.Time
|
||||
PacketNumber protocol.PacketNumber
|
||||
StreamFrames []StreamFrame
|
||||
Frames []*Frame
|
||||
LargestAcked protocol.PacketNumber // InvalidPacketNumber if the packet doesn't contain an ACK
|
||||
Length protocol.ByteCount
|
||||
@@ -32,6 +33,7 @@ var packetPool = sync.Pool{New: func() any { return &Packet{} }}
|
||||
func GetPacket() *Packet {
|
||||
p := packetPool.Get().(*Packet)
|
||||
p.PacketNumber = 0
|
||||
p.StreamFrames = nil
|
||||
p.Frames = nil
|
||||
p.LargestAcked = 0
|
||||
p.Length = 0
|
||||
@@ -51,5 +53,6 @@ func putPacket(p *Packet) {
|
||||
putFrame(f)
|
||||
}
|
||||
p.Frames = nil
|
||||
p.StreamFrames = nil
|
||||
packetPool.Put(p)
|
||||
}
|
||||
|
||||
@@ -243,7 +243,7 @@ func (h *sentPacketHandler) SentPacket(p *Packet) {
|
||||
}
|
||||
|
||||
pnSpace.largestSent = p.PacketNumber
|
||||
isAckEliciting := len(p.Frames) > 0
|
||||
isAckEliciting := len(p.StreamFrames) > 0 || len(p.Frames) > 0
|
||||
|
||||
if isAckEliciting {
|
||||
pnSpace.lastAckElicitingPacketTime = p.SendTime
|
||||
@@ -424,6 +424,9 @@ func (h *sentPacketHandler) detectAndRemoveAckedPackets(ack *wire.AckFrame, encL
|
||||
f.OnAcked(f.Frame)
|
||||
}
|
||||
}
|
||||
for _, f := range p.StreamFrames {
|
||||
f.Handler.OnAcked(f.Frame)
|
||||
}
|
||||
if err := pnSpace.history.Remove(p.PacketNumber); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -790,12 +793,16 @@ func (h *sentPacketHandler) QueueProbePacket(encLevel protocol.EncryptionLevel)
|
||||
}
|
||||
|
||||
func (h *sentPacketHandler) queueFramesForRetransmission(p *Packet) {
|
||||
if len(p.Frames) == 0 {
|
||||
if len(p.Frames) == 0 && len(p.StreamFrames) == 0 {
|
||||
panic("no frames")
|
||||
}
|
||||
for _, f := range p.Frames {
|
||||
f.OnLost(f.Frame)
|
||||
}
|
||||
for _, f := range p.StreamFrames {
|
||||
f.Handler.OnLost(f.Frame)
|
||||
}
|
||||
p.StreamFrames = nil
|
||||
p.Frames = nil
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user