From 371f5c2c7bdd92d556d29b42b442a3a8eac28871 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=D0=AF=C3=98NE?= <88117897+alvarorichard@users.noreply.github.com> Date: Thu, 10 Sep 2026 08:33:49 -0300 Subject: [PATCH] fix: prevent goroutine leak by adding exit signal for RTCP PLI ticker (#697) Co-authored-by: alvarorichard --- server/internal/webrtc/manager.go | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/server/internal/webrtc/manager.go b/server/internal/webrtc/manager.go index c99c9af6..1a0c71e6 100644 --- a/server/internal/webrtc/manager.go +++ b/server/internal/webrtc/manager.go @@ -443,16 +443,25 @@ func (manager *WebRTCManagerCtx) CreatePeer(session types.Session) (*webrtc.Sess ticker := time.NewTicker(rtcpPLIInterval) defer ticker.Stop() - go func() { - for range ticker.C { - err := connection.WriteRTCP([]rtcp.Packet{ - &rtcp.PictureLossIndication{ - MediaSSRC: uint32(track.SSRC()), - }, - }) + //ticker.Stop() does not close channel,so the channel,so the goroutine below needs + //its own singal to exit, otherwise it would block on the ticker channel forever and leak memory + done := make(chan struct{}) + defer close(done) - if err != nil { - logger.Err(err).Msg("remote track rtcp send err") + go func() { + for { + select { + case <-done: + return + case <-ticker.C: + err := connection.WriteRTCP([]rtcp.Packet{ + &rtcp.PictureLossIndication{ + MediaSSRC: uint32(track.SSRC()), + }, + }) + if err != nil { + logger.Err(err).Msg("remote track rtcp send err") + } } } }()