From 6d88154402d82fcc27195dc597c8a1e916628384 Mon Sep 17 00:00:00 2001 From: David Zhao Date: Thu, 24 Feb 2022 15:09:34 -0800 Subject: [PATCH] Reduce lock scope, avoid callbacks under lock (#462) --- pkg/rtc/mediatrackreceiver.go | 32 +++++++++++++------------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/pkg/rtc/mediatrackreceiver.go b/pkg/rtc/mediatrackreceiver.go index badd0fc6b..219ef849b 100644 --- a/pkg/rtc/mediatrackreceiver.go +++ b/pkg/rtc/mediatrackreceiver.go @@ -158,11 +158,10 @@ func (t *MediaTrackReceiver) IsMuted() bool { func (t *MediaTrackReceiver) SetMuted(muted bool) { t.muted.TrySet(muted) - t.lock.RLock() - if t.receiver != nil { - t.receiver.SetUpTrackPaused(muted) + receiver := t.Receiver() + if receiver != nil { + receiver.SetUpTrackPaused(muted) } - t.lock.RUnlock() t.MediaTrackSubscriptions.SetMuted(muted) } @@ -179,10 +178,9 @@ func (t *MediaTrackReceiver) AddOnClose(f func()) { // AddSubscriber subscribes sub to current mediaTrack func (t *MediaTrackReceiver) AddSubscriber(sub types.LocalParticipant) error { - t.lock.RLock() - defer t.lock.RUnlock() + receiver := t.Receiver() - if t.receiver == nil { + if receiver == nil { // cannot add, no receiver return errors.New("cannot subscribe without a receiver in place") } @@ -195,7 +193,7 @@ func (t *MediaTrackReceiver) AddSubscriber(sub types.LocalParticipant) error { streamId = PackStreamID(t.PublisherID(), t.ID()) } - downTrack, err := t.MediaTrackSubscriptions.AddSubscriber(sub, t.receiver.Codec(), NewWrappedReceiver(t.receiver, t.ID(), streamId)) + downTrack, err := t.MediaTrackSubscriptions.AddSubscriber(sub, receiver.Codec(), NewWrappedReceiver(receiver, t.ID(), streamId)) if err != nil { return err } @@ -205,7 +203,7 @@ func (t *MediaTrackReceiver) AddSubscriber(sub types.LocalParticipant) error { downTrack.AddReceiverReportListener(t.handleMaxLossFeedback) } - t.receiver.AddDownTrack(downTrack) + receiver.AddDownTrack(downTrack) } return nil } @@ -346,15 +344,13 @@ func (t *MediaTrackReceiver) DebugInfo() map[string]interface{} { info["DownTracks"] = t.MediaTrackSubscriptions.DebugInfo() - t.lock.RLock() - if t.receiver != nil { - receiverInfo := t.receiver.DebugInfo() + receiver := t.Receiver() + if receiver != nil { + receiverInfo := receiver.DebugInfo() for k, v := range receiverInfo { info[k] = v } } - t.lock.RUnlock() - return info } @@ -370,12 +366,10 @@ func (t *MediaTrackReceiver) OnSubscribedMaxQualityChange(f func(trackID livekit if f != nil && !t.IsMuted() { _ = f(t.ID(), subscribedQualities, maxSubscribedQuality) } - - t.lock.RLock() - if t.receiver != nil { - t.receiver.SetMaxExpectedSpatialLayer(SpatialLayerForQuality(maxSubscribedQuality)) + receiver := t.Receiver() + if receiver != nil { + receiver.SetMaxExpectedSpatialLayer(SpatialLayerForQuality(maxSubscribedQuality)) } - t.lock.RUnlock() }) }