diff options
author | Roxie Linden <roxie@lindenlab.com> | 2024-05-16 12:00:45 -0700 |
---|---|---|
committer | Roxie Linden <roxie@lindenlab.com> | 2024-05-16 12:00:45 -0700 |
commit | c6e147ff224e1adc9a498d4a06ad54fff710d704 (patch) | |
tree | cb97291843f7784b33d2b3e369a91bd8b09f6e29 /indra/newview | |
parent | 57b99aec74783c323738bd5a130c82c8dbf379c2 (diff) |
Race condition resulted in close causing removal of peer connection while other jobs might be using it.
Diffstat (limited to 'indra/newview')
-rw-r--r-- | indra/newview/llvoicewebrtc.cpp | 20 | ||||
-rw-r--r-- | indra/newview/llvoicewebrtc.h | 7 |
2 files changed, 24 insertions, 3 deletions
diff --git a/indra/newview/llvoicewebrtc.cpp b/indra/newview/llvoicewebrtc.cpp index e72d5e6066..2ab4ae2edf 100644 --- a/indra/newview/llvoicewebrtc.cpp +++ b/indra/newview/llvoicewebrtc.cpp @@ -2344,6 +2344,19 @@ void LLVoiceWebRTCConnection::OnRenegotiationNeeded() }); } +// callback from llwebrtc +void LLVoiceWebRTCConnection::OnPeerConnectionClosed() +{ + LL::WorkQueue::postMaybe(mMainQueue, + [=] { + LL_DEBUGS("Voice") << "Peer connection has closed." << LL_ENDL; + if (mVoiceConnectionState == VOICE_STATE_WAIT_FOR_CLOSE) + { + setVoiceConnectionState(VOICE_STATE_CLOSED); + mOutstandingRequests--; + } + }); +} void LLVoiceWebRTCConnection::setMuteMic(bool muted) { @@ -2741,8 +2754,13 @@ bool LLVoiceWebRTCConnection::connectionStateMachine() case VOICE_STATE_SESSION_EXIT: { + setVoiceConnectionState(VOICE_STATE_WAIT_FOR_CLOSE); + mOutstandingRequests++; mWebRTCPeerConnectionInterface->shutdownConnection(); - + break; + case VOICE_STATE_WAIT_FOR_CLOSE: + break; + case VOICE_STATE_CLOSED: if (!mShutDown) { mVoiceConnectionState = VOICE_STATE_START_SESSION; diff --git a/indra/newview/llvoicewebrtc.h b/indra/newview/llvoicewebrtc.h index c417dfe329..fcd4c04e98 100644 --- a/indra/newview/llvoicewebrtc.h +++ b/indra/newview/llvoicewebrtc.h @@ -585,6 +585,7 @@ class LLVoiceWebRTCConnection : void OnIceCandidate(const llwebrtc::LLWebRTCIceCandidate &candidate) override; void OnOfferAvailable(const std::string &sdp) override; void OnRenegotiationNeeded() override; + void OnPeerConnectionClosed() override; void OnAudioEstablished(llwebrtc::LLWebRTCAudioInterface *audio_interface) override; //@} @@ -640,13 +641,15 @@ class LLVoiceWebRTCConnection : VOICE_STATE_DISCONNECT = 0x100, VOICE_STATE_WAIT_FOR_EXIT = 0x200, VOICE_STATE_SESSION_EXIT = 0x400, - VOICE_STATE_SESSION_STOPPING = 0x780 + VOICE_STATE_WAIT_FOR_CLOSE = 0x800, + VOICE_STATE_CLOSED = 0x1000, + VOICE_STATE_SESSION_STOPPING = 0x1F80 } EVoiceConnectionState; EVoiceConnectionState mVoiceConnectionState; LL::WorkQueue::weak_t mMainQueue; - void setVoiceConnectionState(EVoiceConnectionState new_voice_connection_state) + void setVoiceConnectionState(EVoiceConnectionState new_voice_connection_state) { if (new_voice_connection_state & VOICE_STATE_SESSION_STOPPING) { |