From 9125a29e79fedd72b09306f90358426cd9afc915 Mon Sep 17 00:00:00 2001 From: 9seconds Date: Mon, 23 Mar 2020 17:08:13 +0300 Subject: [PATCH] Add pools for packetack --- wrappers/packetack/client_abridged.go | 4 +- .../packetack/client_intermediate_secure.go | 7 ++-- wrappers/packetack/pools.go | 37 +++++++++++++++++++ wrappers/packetack/proxy.go | 3 +- 4 files changed, 46 insertions(+), 5 deletions(-) create mode 100644 wrappers/packetack/pools.go diff --git a/wrappers/packetack/client_abridged.go b/wrappers/packetack/client_abridged.go index 1b8aa9a..556a4f2 100644 --- a/wrappers/packetack/client_abridged.go +++ b/wrappers/packetack/client_abridged.go @@ -88,7 +88,9 @@ func (w *wrapperClientAbridged) Write(packet conntypes.Packet, acks *conntypes.C return nil case packetLength < clientAbridgedLargePacketLength: length24 := utils.ToUint24(uint32(packetLength)) - buf := bytes.Buffer{} + + buf := acquireClientBytesBuffer() + defer releaseClientBytesBuffer(buf) buf.WriteByte(byte(clientAbridgedSmallPacketLength)) buf.Write(length24[:]) diff --git a/wrappers/packetack/client_intermediate_secure.go b/wrappers/packetack/client_intermediate_secure.go index 153e779..9c3c448 100644 --- a/wrappers/packetack/client_intermediate_secure.go +++ b/wrappers/packetack/client_intermediate_secure.go @@ -1,7 +1,6 @@ package packetack import ( - "bytes" "encoding/binary" "fmt" "math/rand" @@ -35,11 +34,13 @@ func (w *wrapperClientIntermediateSecure) Write(packet conntypes.Packet, acks *c return nil } - buf := bytes.Buffer{} + buf := acquireClientBytesBuffer() + defer releaseClientBytesBuffer(buf) + paddingLength := rand.Intn(4) buf.Grow(4 + len(packet) + paddingLength) - binary.Write(&buf, binary.LittleEndian, uint32(len(packet)+paddingLength)) // nolint: errcheck + binary.Write(buf, binary.LittleEndian, uint32(len(packet)+paddingLength)) // nolint: errcheck buf.Write(packet) buf.Write(make([]byte, paddingLength)) diff --git a/wrappers/packetack/pools.go b/wrappers/packetack/pools.go new file mode 100644 index 0000000..7cd7fd5 --- /dev/null +++ b/wrappers/packetack/pools.go @@ -0,0 +1,37 @@ +package packetack + +import ( + "bytes" + "sync" +) + +var ( + poolClientBytesBuffer = sync.Pool{ + New: func() interface{} { + return &bytes.Buffer{} + }, + } + poolProxyBytesBuffer = sync.Pool{ + New: func() interface{} { + return &bytes.Buffer{} + }, + } +) + +func acquireClientBytesBuffer() *bytes.Buffer { + return poolClientBytesBuffer.Get().(*bytes.Buffer) +} + +func acquireProxyBytesBuffer() *bytes.Buffer { + return poolProxyBytesBuffer.Get().(*bytes.Buffer) +} + +func releaseClientBytesBuffer(buf *bytes.Buffer) { + buf.Reset() + poolClientBytesBuffer.Put(buf) +} + +func releaseProxyBytesBuffer(buf *bytes.Buffer) { + buf.Reset() + poolProxyBytesBuffer.Put(buf) +} diff --git a/wrappers/packetack/proxy.go b/wrappers/packetack/proxy.go index 62ac7d2..25ae6cb 100644 --- a/wrappers/packetack/proxy.go +++ b/wrappers/packetack/proxy.go @@ -22,7 +22,8 @@ type wrapperProxy struct { } func (w *wrapperProxy) Write(packet conntypes.Packet, acks *conntypes.ConnectionAcks) error { - buf := bytes.Buffer{} + buf := acquireProxyBytesBuffer() + defer releaseProxyBytesBuffer(buf) flags := w.flags if acks.Quick {