Explorar el Código

Merge pull request #227 from paullouisageneau/resetcallbacks-once

Reset callbacks of PeerConnection only once on close
Paul-Louis Ageneau hace 4 años
padre
commit
5e876a4686
Se han modificado 1 ficheros con 20 adiciones y 17 borrados
  1. 20 17
      src/peerconnection.cpp

+ 20 - 17
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();
@@ -1027,10 +1028,10 @@ bool PeerConnection::changeState(State state) {
 	State current;
 	do {
 		current = mState.load();
-		if (current == state)
-			return true;
 		if (current == State::Closed)
 			return false;
+		if (current == state)
+			return false;
 
 	} while (!mState.compare_exchange_weak(current, state));
 
@@ -1048,22 +1049,24 @@ bool PeerConnection::changeState(State state) {
 }
 
 bool PeerConnection::changeGatheringState(GatheringState state) {
-	if (mGatheringState.exchange(state) != state) {
-		std::ostringstream s;
-		s << state;
-		PLOG_INFO << "Changed gathering state to " << s.str();
-		mProcessor->enqueue([this, state] { mGatheringStateChangeCallback(state); });
-	}
+	if (mGatheringState.exchange(state) == state)
+		return false;
+	
+	std::ostringstream s;
+	s << state;
+	PLOG_INFO << "Changed gathering state to " << s.str();
+	mProcessor->enqueue([this, state] { mGatheringStateChangeCallback(state); });
 	return true;
 }
 
 bool PeerConnection::changeSignalingState(SignalingState state) {
-	if (mSignalingState.exchange(state) != state) {
-		std::ostringstream s;
-		s << state;
-		PLOG_INFO << "Changed signaling state to " << s.str();
-		mProcessor->enqueue([this, state] { mSignalingStateChangeCallback(state); });
-	}
+	if (mSignalingState.exchange(state) == state) 
+		return false;
+	
+	std::ostringstream s;
+	s << state;
+	PLOG_INFO << "Changed signaling state to " << s.str();
+	mProcessor->enqueue([this, state] { mSignalingStateChangeCallback(state); });
 	return true;
 }