From 9313fe25dd3bd392ca5b8ed3859f1a36fc66ad66 Mon Sep 17 00:00:00 2001 From: xtaci Date: Fri, 1 Nov 2019 14:28:14 +0000 Subject: [PATCH] purge outgoing segments when closing --- kcp.go | 12 ++++++++++++ sess.go | 2 ++ 2 files changed, 14 insertions(+) diff --git a/kcp.go b/kcp.go index cefd59c..b833e3b 100644 --- a/kcp.go +++ b/kcp.go @@ -1051,3 +1051,15 @@ func (kcp *KCP) remove_front(q []segment, n int) []segment { } return q[n:] } + +// Release all cached outgoing segments +func (kcp *KCP) ReleaseTX() { + for k := range kcp.snd_queue { + xmitBuf.Put(kcp.snd_queue[k].data) + } + for k := range kcp.snd_buf { + xmitBuf.Put(kcp.snd_buf[k].data) + } + kcp.snd_queue = nil + kcp.snd_buf = nil +} diff --git a/sess.go b/sess.go index 3ff2aa6..779d5c5 100644 --- a/sess.go +++ b/sess.go @@ -353,6 +353,8 @@ func (s *UDPSession) Close() error { s.mu.Lock() s.kcp.flush(false) s.uncork() + // release pending segments + s.kcp.ReleaseTX() s.mu.Unlock() if s.l != nil { // belongs to listener