Skip to content

Commit 1e89e85

Browse files
committed
Use buffer pool on packetHandler instead of global.
1 parent 4b8eeae commit 1e89e85

File tree

1 file changed

+15
-10
lines changed

1 file changed

+15
-10
lines changed

service/udp.go

+15-10
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,6 @@ type UDPConnMetrics interface {
4747
// Max UDP buffer size for the server code.
4848
const serverUDPBufferSize = 64 * 1024
4949

50-
var bufferPool = sync.Pool{
51-
New: func() interface{} {
52-
return make([]byte, serverUDPBufferSize)
53-
},
54-
}
55-
5650
// Wrapper for slog.Debug during UDP proxying.
5751
func debugUDP(l *slog.Logger, template string, cipherID string, attr slog.Attr) {
5852
// This is an optimization to reduce unnecessary allocations due to an interaction
@@ -91,6 +85,7 @@ func findAccessKeyUDP(clientIP netip.Addr, dst, src []byte, cipherList CipherLis
9185

9286
type packetHandler struct {
9387
logger *slog.Logger
88+
bufferPool sync.Pool
9489
natTimeout time.Duration
9590
ciphers CipherList
9691
ssm ShadowsocksConnMetrics
@@ -102,8 +97,14 @@ func NewPacketHandler(natTimeout time.Duration, cipherList CipherList, ssMetrics
10297
if ssMetrics == nil {
10398
ssMetrics = &NoOpShadowsocksConnMetrics{}
10499
}
100+
bufferPool := sync.Pool{
101+
New: func() interface{} {
102+
return make([]byte, serverUDPBufferSize)
103+
},
104+
}
105105
return &packetHandler{
106106
logger: noopLogger(),
107+
bufferPool: bufferPool,
107108
natTimeout: natTimeout,
108109
ciphers: cipherList,
109110
ssm: ssMetrics,
@@ -138,9 +139,8 @@ type PacketHandleFunc func(conn net.Conn)
138139
func PacketServe(clientConn net.PacketConn, handle PacketHandleFunc, metrics NATMetrics) {
139140
nm := newNATmap()
140141
defer nm.Close()
142+
buffer := make([]byte, serverUDPBufferSize)
141143
for {
142-
buffer := bufferPool.Get().([]byte)
143-
defer bufferPool.Put(buffer)
144144
n, addr, err := clientConn.ReadFrom(buffer)
145145
if err != nil {
146146
if errors.Is(err, net.ErrClosed) {
@@ -210,10 +210,15 @@ func (h *packetHandler) Handle(clientConn net.Conn, connMetrics UDPConnMetrics)
210210
return
211211
}
212212

213+
cipherBuf := h.bufferPool.Get().([]byte)
214+
textBuf := h.bufferPool.Get().([]byte)
215+
defer func() {
216+
h.bufferPool.Put(cipherBuf)
217+
h.bufferPool.Put(textBuf)
218+
}()
219+
213220
var cryptoKey *shadowsocks.EncryptionKey
214221
var proxyTargetBytes int
215-
cipherBuf := make([]byte, serverUDPBufferSize)
216-
textBuf := make([]byte, serverUDPBufferSize)
217222
for {
218223
clientProxyBytes, err := clientConn.Read(cipherBuf)
219224
if errors.Is(err, net.ErrClosed) {

0 commit comments

Comments
 (0)