From 96dbcd9dcb83632bb4ada81995cfa0ba0af39c25 Mon Sep 17 00:00:00 2001 From: Juliusz Chroboczek Date: Sun, 13 Sep 2020 02:26:34 +0200 Subject: [PATCH] Release lock early in newUpConn. Otherwise recording to disk causes a deadlock. --- rtpconn.go | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/rtpconn.go b/rtpconn.go index 59fb159..28fccf1 100644 --- a/rtpconn.go +++ b/rtpconn.go @@ -400,7 +400,6 @@ func newUpConn(c client, id string) (*rtpUpConnection, error) { pc.OnTrack(func(remote *webrtc.Track, receiver *webrtc.RTPReceiver) { conn.mu.Lock() - defer conn.mu.Unlock() mid := getTrackMid(pc, remote) if mid == "" { @@ -435,11 +434,19 @@ func newUpConn(c client, id string) (*rtpUpConnection, error) { go rtcpUpListener(conn, track, receiver) - if conn.complete() { - tracks := make([]upTrack, len(conn.tracks)) + complete := conn.complete() + var tracks []upTrack + if(complete) { + tracks = make([]upTrack, len(conn.tracks)) for i, t := range conn.tracks { tracks[i] = t } + } + + // pushConn might need to take the lock + conn.mu.Unlock() + + if complete { clients := c.Group().getClients(c) for _, cc := range clients { cc.pushConn(conn.id, conn, tracks, conn.label)