Optimizations:
- ringbuffer: optimize Len(), IsEmpty(), Discard(), Clear() methods with
branchless arithmetic and simplified logic
- fec: fix memory leak in shardHeap.Pop() by setting element to nil before
truncating slice, preventing GC from holding stale references
- timedsched: fix memory leak in timedFuncHeap.Pop() with same nil-before-truncate
pattern; optimize prepend() using slice swap instead of append
- autotune: add sortCache field to Autotuner to reuse slice allocation in
FindPeriod(), avoiding repeated allocations during period detection
- snmp: replace fmt.Sprint with strconv.FormatUint for better performance
in Copy() and Reset() methods
- entropy: remove defer overhead in rngAES.Read() and rngChacha8.Read()
hot paths for reduced function call cost
- bufferpool: pre-allocate ErrBufferPoolSizeExceeded error; reset slice
length on Put() to allow proper reuse
- sess: remove defer overhead in 6 setter methods (SetWriteDelay,
SetWindowSize, SetStreamMode, SetACKNoDelay, SetDUP, SetNoDelay)
These changes reduce memory allocations, fix potential memory leaks in
heap-based data structures, and eliminate defer overhead in frequently
called methods.
Fix shouldTune flag not being reset when auto-detected FEC parameters
match current parameters. This could cause the decoder to permanently
discard all incoming packets if a corrupted packet triggered shouldTune
but the actual FEC configuration hadn't changed.
Move `dec.shouldTune = false` outside the parameter-change check to
ensure the flag is always reset when valid parameters are detected.
- Previously, the repeat flag was never set to true when duplicate packets
were detected, causing incorrect statistics reporting
- Added missing else branch to properly mark duplicate segments
- Impact: Correct tracking of repeated packet statistics
2. Fix memory leak in FEC decoder auto-tune functionality
- When FEC parameters were adjusted dynamically, the old shardSet map
was discarded without recycling its buffer pool entries
- Added proper cleanup loop to return old shard packets to buffer pool
before creating new shardSet
- Impact: Prevents memory growth during long-lived connections with
dynamic FEC parameter adjustments
Files modified:
- kcp.go: Added else branch in parse_data() to set repeat=true for duplicates
- fec.go: Added buffer cleanup loop before shardSet recreation in decode()
All existing tests pass, including FEC encoding/decoding and lossy connection tests.
- Replace atomic.Pointer[func([]byte)] with atomic.Value for OOB callback storage to improve compatibility.
- Rename SetCallbackForOOB to SetOOBHandler and GetMaxSizeForOOB to GetOOBMaxSize for clearer, consistent API naming.
- Add locking in SendOOB to ensure thread safety during OOB packet construction.
- Update related test cases in sess_test.go to use the new interface names.
- Revise comments and documentation for better clarity and maintainability.
user takes care of the nil handler
use 0xffffffff as the seqid of OOB
return error on nil handler
fix race in test
shorten test data size
add more test on OOB
enhance Error test
allow nil from sender side
add OOBPackets in snmp
use dummy handler instead of resetting the atomic.Value
add test for dummy handler
remove a comment
formalize callback function prototype
use const
rename to expose
Add comments to clarify KCP input and FEC decoding order for FEC packets.
fix test
comments
add TestOOB_OneSideHandler
- Properly recycle `fecPacket`s popped from `shardHeap` back to `defaultBufferPool` in `decode()`.
- Recycle newly allocated buffers if `ReconstructData` fails (on success, they are returned to the caller to be recycled).
- Recycle all packets within an expired shard before deleting it in `discardShards()`.
2. Correct PAWS (Protect Against Wrapped Sequence numbers) logic:
- Update `newestShardId` comparison and expiration checks to use scaled sequence numbers () instead of raw shard IDs.
- This ensures correctly handles sequence wrapping boundaries, which was previously inaccurate when comparing raw shard IDs directly.