diff --git a/Sources/NIOHTTP2/Frame Buffers/OutboundFlowControlBuffer.swift b/Sources/NIOHTTP2/Frame Buffers/OutboundFlowControlBuffer.swift index 7db2b5e6..576b33a0 100644 --- a/Sources/NIOHTTP2/Frame Buffers/OutboundFlowControlBuffer.swift +++ b/Sources/NIOHTTP2/Frame Buffers/OutboundFlowControlBuffer.swift @@ -250,6 +250,9 @@ private struct DataBuffer { return self.bufferedChunks.hasMark } + /// An empty buffer, we use this avoid an allocation in 'evacuatePendingWrites'. + private static let emptyBuffer = MarkedCircularBuffer(initialCapacity: 0) + init() { self.bufferedChunks = MarkedCircularBuffer(initialCapacity: 8) self.flushedBufferedBytes = 0 @@ -307,7 +310,7 @@ private struct DataBuffer { /// Removes all pending writes, invalidating this structure as it does so. mutating func evacuatePendingWrites() -> MarkedCircularBuffer { - var buffer = MarkedCircularBuffer(initialCapacity: 0) + var buffer = DataBuffer.emptyBuffer swap(&buffer, &self.bufferedChunks) return buffer } diff --git a/Sources/NIOHTTP2/HTTP2StreamChannel.swift b/Sources/NIOHTTP2/HTTP2StreamChannel.swift index 96b3416a..735774e6 100644 --- a/Sources/NIOHTTP2/HTTP2StreamChannel.swift +++ b/Sources/NIOHTTP2/HTTP2StreamChannel.swift @@ -649,8 +649,8 @@ final class HTTP2StreamChannel: Channel, ChannelCore { private extension HTTP2StreamChannel { /// Drop all pending reads. private func dropPendingReads() { - /// To drop all the reads, as we don't need to report it, we just allocate a new buffer of 0 size. - self.pendingReads = CircularBuffer(initialCapacity: 0) + /// We don't need to report the dropped reads, just remove them all. + self.pendingReads.removeAll() } /// Deliver all pending reads to the channel.