Update v1.2.0
This commit is contained in:
+27
-1
@@ -9,6 +9,27 @@ import (
|
||||
"time"
|
||||
)
|
||||
|
||||
var pktPool = sync.Pool{
|
||||
New: func() interface{} {
|
||||
return make([]byte, 2048)
|
||||
},
|
||||
}
|
||||
|
||||
func getPktBuf(size int) []byte {
|
||||
b := pktPool.Get().([]byte)
|
||||
if cap(b) < size {
|
||||
b = make([]byte, size)
|
||||
}
|
||||
return b[:size]
|
||||
}
|
||||
|
||||
func putPktBuf(b []byte) {
|
||||
if cap(b) < 2048 {
|
||||
return
|
||||
}
|
||||
pktPool.Put(b[:cap(b)])
|
||||
}
|
||||
|
||||
const (
|
||||
returnChBuf = 384
|
||||
|
||||
@@ -125,13 +146,14 @@ func (d *Dispatcher) readLoop() {
|
||||
d.clientAddr.Store(&addr)
|
||||
atomic.AddInt64(&d.stats.TotalBytesUp, int64(n))
|
||||
|
||||
pkt := make([]byte, n)
|
||||
pkt := getPktBuf(n)
|
||||
copy(pkt, buf[:n])
|
||||
|
||||
d.mu.Lock()
|
||||
nw := len(d.workers)
|
||||
if nw == 0 {
|
||||
d.mu.Unlock()
|
||||
putPktBuf(pkt)
|
||||
continue
|
||||
}
|
||||
|
||||
@@ -169,6 +191,7 @@ func (d *Dispatcher) readLoop() {
|
||||
// Все workers перегружены — сдвигаем указатель, пакет дропается
|
||||
d.rrIndex = (idx + 1) % nw
|
||||
d.rrCount = 0
|
||||
putPktBuf(pkt)
|
||||
}
|
||||
d.mu.Unlock()
|
||||
}
|
||||
@@ -184,15 +207,18 @@ func (d *Dispatcher) writeLoop() {
|
||||
case pkt := <-d.ReturnCh:
|
||||
addrPtr := d.clientAddr.Load()
|
||||
if addrPtr == nil {
|
||||
putPktBuf(pkt)
|
||||
continue
|
||||
}
|
||||
addr := *addrPtr
|
||||
if _, err := d.localConn.WriteTo(pkt, addr); err != nil {
|
||||
if d.ctx.Err() != nil {
|
||||
putPktBuf(pkt)
|
||||
return
|
||||
}
|
||||
}
|
||||
atomic.AddInt64(&d.stats.TotalBytesDown, int64(len(pkt)))
|
||||
putPktBuf(pkt)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user