Merge pull request #2117 from lucas-clemente/send-pooled-stream-frames

use the STREAM frame buffer for receiving stream data
This commit is contained in:
Marten Seemann
2019-09-08 10:23:46 +07:00
committed by GitHub
8 changed files with 72 additions and 50 deletions

View File

@@ -5,5 +5,5 @@ import "github.com/lucas-clemente/quic-go/internal/wire"
type Frame struct {
wire.Frame // nil if the frame has already been acknowledged in another packet
OnLost func(wire.Frame)
OnAcked func()
OnAcked func(wire.Frame)
}

View File

@@ -446,7 +446,7 @@ func (h *sentPacketHandler) onPacketAcked(p *Packet, rcvTime time.Time) error {
for _, f := range p.Frames {
if f.OnAcked != nil {
f.OnAcked()
f.OnAcked(f.Frame)
}
}
if p.includedInBytesInFlight {

View File

@@ -202,9 +202,14 @@ var _ = Describe("SentPacketHandler", func() {
It("calls the OnAcked callback", func() {
var acked bool
ping := &wire.PingFrame{}
handler.SentPacket(ackElicitingPacket(&Packet{
PacketNumber: 13,
Frames: []Frame{{Frame: &wire.PingFrame{}, OnAcked: func() { acked = true }}},
Frames: []Frame{{Frame: ping, OnAcked: func(f wire.Frame) {
Expect(f).To(Equal(ping))
acked = true
},
}},
}))
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 13, Largest: 13}}}
Expect(handler.ReceivedAck(ack, 1, protocol.Encryption1RTT, time.Now())).To(Succeed())

View File

@@ -17,7 +17,7 @@ func init() {
}
}
func getStreamFrame() *StreamFrame {
func GetStreamFrame() *StreamFrame {
f := pool.Get().(*StreamFrame)
return f
}

View File

@@ -7,12 +7,12 @@ import (
var _ = Describe("Pool", func() {
It("gets and puts STREAM frames", func() {
f := getStreamFrame()
f := GetStreamFrame()
putStreamFrame(f)
})
It("panics when putting a STREAM frame with a wrong capacity", func() {
f := getStreamFrame()
f := GetStreamFrame()
f.Data = []byte("foobar")
Expect(func() { putStreamFrame(f) }).To(Panic())
})

View File

@@ -59,7 +59,7 @@ func parseStreamFrame(r *bytes.Reader, version protocol.VersionNumber) (*StreamF
if dataLen < protocol.MinStreamFrameBufferSize {
frame = &StreamFrame{Data: make([]byte, dataLen)}
} else {
frame = getStreamFrame()
frame = GetStreamFrame()
// The STREAM frame can't be larger than the StreamFrame we obtained from the buffer,
// since those StreamFrames have a buffer length of the maximum packet size.
if dataLen > uint64(cap(frame.Data)) {
@@ -167,7 +167,7 @@ func (f *StreamFrame) MaybeSplitOffFrame(maxSize protocol.ByteCount, version pro
return nil, true
}
new := getStreamFrame()
new := GetStreamFrame()
new.StreamID = f.StreamID
new.Offset = f.Offset
new.FinBit = false