@@ -17,14 +17,11 @@ import (
1717func (session * Session ) GetHost (streamKey string ) (host * whip.WhipSession , foundSession bool ) {
1818 log .Println ("Session.GetHost" )
1919
20- if session .Host == nil {
20+ host = session .Host .Load ()
21+ if host == nil {
2122 return nil , false
2223 }
2324
24- session .HostLock .RLock ()
25- host = session .Host
26- session .HostLock .RUnlock ()
27-
2825 return host , true
2926}
3027
@@ -56,16 +53,17 @@ func (session *Session) UpdateStreamStatus(profile authorization.PublicProfile)
5653func (session * Session ) AddWhep (whepSessionId string , peerConnection * webrtc.PeerConnection , audioTrack * codecs.TrackMultiCodec , videoTrack * codecs.TrackMultiCodec , videoRtcpSender * webrtc.RTPSender ) (err error ) {
5754 log .Println ("WhipSessionManager.WhipSession.AddWhepSession" )
5855
59- if session .Host == nil {
56+ host := session .Host .Load ()
57+ if host == nil {
6058 return fmt .Errorf ("no host was found on the current session" )
6159 }
6260
6361 whepSession := whep .CreateNewWhep (
6462 whepSessionId ,
6563 audioTrack ,
66- session . Host .GetHighestPrioritizedAudioTrack (),
64+ host .GetHighestPrioritizedAudioTrack (),
6765 videoTrack ,
68- session . Host .GetHighestPrioritizedVideoTrack (),
66+ host .GetHighestPrioritizedVideoTrack (),
6967 peerConnection )
7068
7169 whepSession .RegisterWhepHandlers (peerConnection )
@@ -74,12 +72,12 @@ func (session *Session) AddWhep(whepSessionId string, peerConnection *webrtc.Pee
7472 session .WhepSessions [whepSessionId ] = whepSession
7573 session .WhepSessionsLock .Unlock ()
7674
77- go session .handleWhepConnection (session . Host , whepSession )
75+ go session .handleWhepConnection (host , whepSession )
7876 go session .handleWhepChannels (whepSession )
7977 go session .handleWhepVideoRtcpSender (videoRtcpSender )
8078
8179 // TODO: Implement
82- // go session.handleWhepLayerChange(session.Host , whepSession)
80+ // go session.handleWhepLayerChange(host , whepSession)
8381
8482 return nil
8583}
@@ -88,20 +86,24 @@ func (session *Session) AddWhep(whepSessionId string, peerConnection *webrtc.Pee
8886func (session * Session ) AddHost (peerConnection * webrtc.PeerConnection ) (err error ) {
8987 log .Println ("Session.AddHost" )
9088
91- session .HostLock .Lock ()
89+ for {
90+ host := session .Host .Load ()
91+ if host == nil {
92+ break
93+ }
9294
93- if session .Host != nil && session .Host .PeerConnection .ConnectionState () == webrtc .PeerConnectionStateClosed {
94- if session .ActiveContext .Err () != nil {
95- session .Host = nil
96- } else {
97- session .HostLock .Unlock ()
95+ if host .PeerConnection .ConnectionState () != webrtc .PeerConnectionStateClosed || session .ActiveContext .Err () == nil {
9896 return fmt .Errorf ("session already has a host" )
9997 }
98+
99+ if session .Host .CompareAndSwap (host , nil ) {
100+ break
101+ }
100102 }
101103
102104 activeContext , activeContextCancel := context .WithCancel (context .Background ())
103105
104- session . Host = & whip.WhipSession {
106+ host : = & whip.WhipSession {
105107 Id : uuid .New ().String (),
106108 AudioTracks : make (map [string ]* whip.AudioTrack ),
107109 VideoTracks : make (map [string ]* whip.VideoTrack ),
@@ -113,8 +115,13 @@ func (session *Session) AddHost(peerConnection *webrtc.PeerConnection) (err erro
113115 ActiveContextCancel : activeContextCancel ,
114116 }
115117
116- session .Host .AddPeerConnection (peerConnection , session .StreamKey )
117- session .HostLock .Unlock ()
118+ host .AddPeerConnection (peerConnection , session .StreamKey )
119+ if ! session .Host .CompareAndSwap (nil , host ) {
120+ host .ActiveContextCancel ()
121+ host .RemovePeerConnection ()
122+ host .RemoveTracks ()
123+ return fmt .Errorf ("session already has a host" )
124+ }
118125
119126 go session .hostStatusLoop ()
120127
@@ -123,20 +130,17 @@ func (session *Session) AddHost(peerConnection *webrtc.PeerConnection) (err erro
123130
124131func (session * Session ) RemoveHost () {
125132
126- if session .Host == nil {
133+ host := session .Host .Swap (nil )
134+ if host == nil {
127135 log .Println ("Session.RemoveHost" , session .StreamKey , "- No host to remove" )
128136 return
129137 }
130138
131139 log .Println ("Session.RemoveHost" , session .StreamKey )
132140
133- session .Host .ActiveContextCancel ()
134- session .Host .RemovePeerConnection ()
135- session .Host .RemoveTracks ()
136-
137- session .HostLock .Lock ()
138- session .Host = nil
139- session .HostLock .Unlock ()
141+ host .ActiveContextCancel ()
142+ host .RemovePeerConnection ()
143+ host .RemoveTracks ()
140144}
141145
142146// Remove Whep session from Whip session
@@ -197,24 +201,25 @@ func (session *Session) isEmpty() bool {
197201// Returns true if any tracks are available for the session
198202func (session * Session ) isStreaming () bool {
199203
200- if session .Host == nil {
204+ host := session .Host .Load ()
205+ if host == nil {
201206 return false
202207 }
203208
204- session . Host .TracksLock .RLock ()
209+ host .TracksLock .RLock ()
205210
206- if len (session . Host .AudioTracks ) != 0 {
207- log .Println ("Session.IsActive.AudioTracks" , len (session . Host .AudioTracks ))
208- session . Host .TracksLock .RUnlock ()
211+ if len (host .AudioTracks ) != 0 {
212+ log .Println ("Session.IsActive.AudioTracks" , len (host .AudioTracks ))
213+ host .TracksLock .RUnlock ()
209214 return true
210215 }
211- if len (session . Host .VideoTracks ) != 0 {
212- log .Println ("Session.IsActive.VideoTracks" , len (session . Host .VideoTracks ))
213- session . Host .TracksLock .RUnlock ()
216+ if len (host .VideoTracks ) != 0 {
217+ log .Println ("Session.IsActive.VideoTracks" , len (host .VideoTracks ))
218+ host .TracksLock .RUnlock ()
214219 return true
215220 }
216221
217- session . Host .TracksLock .RUnlock ()
222+ host .TracksLock .RUnlock ()
218223 return false
219224}
220225
0 commit comments