Browse Source

Handle state changes atomically

Paul-Louis Ageneau 5 years ago
parent
commit
e55d4e906b
4 changed files with 8 additions and 10 deletions
  1. 2 2
      src/dtlstransport.cpp
  2. 2 2
      src/icetransport.cpp
  3. 2 4
      src/peerconnection.cpp
  4. 2 2
      src/sctptransport.cpp

+ 2 - 2
src/dtlstransport.cpp

@@ -112,8 +112,8 @@ bool DtlsTransport::send(message_ptr message) {
 void DtlsTransport::incoming(message_ptr message) { mIncomingQueue.push(message); }
 
 void DtlsTransport::changeState(State state) {
-	mState = state;
-	mStateChangeCallback(state);
+	if (mState.exchange(state) != state)
+		mStateChangeCallback(state);
 }
 
 void DtlsTransport::runRecvLoop() {

+ 2 - 2
src/icetransport.cpp

@@ -226,8 +226,8 @@ void IceTransport::outgoing(message_ptr message) {
 }
 
 void IceTransport::changeState(State state) {
-	mState = state;
-	mStateChangeCallback(mState);
+	if (mState.exchange(state) != state)
+		mStateChangeCallback(mState);
 }
 
 void IceTransport::changeGatheringState(GatheringState state) {

+ 2 - 4
src/peerconnection.cpp

@@ -363,14 +363,12 @@ void PeerConnection::triggerDataChannel(weak_ptr<PeerConnection> weak_this, weak
 }
 
 void PeerConnection::changeState(State state) {
-	mState = state;
-	if (mStateChangeCallback)
+	if (mState.exchange(state) != state && mStateChangeCallback)
 		mStateChangeCallback(state);
 }
 
 void PeerConnection::changeGatheringState(GatheringState state) {
-	mGatheringState = state;
-	if (mGatheringStateChangeCallback)
+	if (mGatheringState.exchange(state) != state && mGatheringStateChangeCallback)
 		mGatheringStateChangeCallback(state);
 }
 

+ 2 - 2
src/sctptransport.cpp

@@ -178,8 +178,8 @@ void SctpTransport::incoming(message_ptr message) {
 }
 
 void SctpTransport::changeState(State state) {
-	mState = state;
-	mStateChangeCallback(state);
+	if (mState.exchange(state) != state)
+		mStateChangeCallback(state);
 }
 
 void SctpTransport::runConnectAndSendLoop() {