Browse Source

Reset callbacks of PeerConnection only once

Paul-Louis Ageneau 4 years ago
parent
commit
25077878a1
1 changed files with 7 additions and 5 deletions
  1. 7 5
      src/peerconnection.cpp

+ 7 - 5
src/peerconnection.cpp

@@ -110,7 +110,7 @@ void PeerConnection::setLocalDescription(Description::Type type) {
 		if (signalingState == SignalingState::HaveLocalOffer ||
 		    signalingState == SignalingState::HaveLocalPranswer) {
 			PLOG_DEBUG << "Rolling back pending local description";
-			
+
 			std::unique_lock lock(mLocalDescriptionMutex);
 			if (mCurrentLocalDescription) {
 				std::vector<Candidate> existingCandidates;
@@ -122,7 +122,7 @@ void PeerConnection::setLocalDescription(Description::Type type) {
 				mCurrentLocalDescription.reset();
 			}
 			lock.unlock();
-			
+
 			changeSignalingState(SignalingState::Stable);
 		}
 		return;
@@ -582,7 +582,8 @@ void PeerConnection::closeTransports() {
 	PLOG_VERBOSE << "Closing transports";
 
 	// Change state to sink state Closed
-	changeState(State::Closed);
+	if (!changeState(State::Closed))
+		return; // already closed
 
 	// Reset callbacks now that state is changed
 	resetCallbacks();
@@ -1024,13 +1025,14 @@ void PeerConnection::triggerTrack(std::shared_ptr<Track> track) {
 }
 
 bool PeerConnection::changeState(State state) {
+	// Return false if the current State is Closed
 	State current;
 	do {
 		current = mState.load();
-		if (current == state)
-			return true;
 		if (current == State::Closed)
 			return false;
+		if (current == state)
+			return true;
 
 	} while (!mState.compare_exchange_weak(current, state));