Browse Source

Changed WebSocket closing process to prevent resetting callbacks

Paul-Louis Ageneau 3 years ago
parent
commit
48a1100149
2 changed files with 8 additions and 20 deletions
  1. 6 9
      src/impl/websocket.cpp
  2. 2 11
      src/websocket.cpp

+ 6 - 9
src/impl/websocket.cpp

@@ -322,8 +322,8 @@ shared_ptr<WsTransport> WebSocket::initWsTransport() {
 			case State::Connected:
 				if (state == WebSocket::State::Connecting) {
 					PLOG_DEBUG << "WebSocket open";
-					changeState(WebSocket::State::Open);
-					triggerOpen();
+					if (changeState(WebSocket::State::Open))
+						triggerOpen();
 				}
 				break;
 			case State::Failed:
@@ -370,13 +370,8 @@ shared_ptr<WsHandshake> WebSocket::getWsHandshake() const {
 void WebSocket::closeTransports() {
 	PLOG_VERBOSE << "Closing transports";
 
-	if (state.load() != State::Closed) {
-		changeState(State::Closed);
-		triggerClosed();
-	}
-
-	// Reset callbacks now that state is changed
-	resetCallbacks();
+	if (!changeState(State::Closed))
+		return; // already closed
 
 	// Pass the pointers to a thread, allowing to terminate a transport from its own thread
 	auto ws = std::atomic_exchange(&mWsTransport, decltype(mWsTransport)(nullptr));
@@ -395,6 +390,8 @@ void WebSocket::closeTransports() {
 		    tls.reset();
 		    tcp.reset();
 	    });
+
+	triggerClosed();
 }
 
 } // namespace rtc::impl

+ 2 - 11
src/websocket.cpp

@@ -39,6 +39,7 @@ WebSocket::WebSocket(impl_ptr<impl::WebSocket> impl)
 WebSocket::~WebSocket() {
 	try {
 		impl()->remoteClose();
+		impl()->resetCallbacks(); // not done by impl::WebSocket
 	} catch (const std::exception &e) {
 		PLOG_ERROR << e.what();
 	}
@@ -57,17 +58,7 @@ void WebSocket::open(const string &url) {
 	impl()->open(url);
 }
 
-void WebSocket::close() {
-	auto state = impl()->state.load();
-	if (state == State::Connecting || state == State::Open) {
-		PLOG_VERBOSE << "Closing WebSocket";
-		impl()->changeState(State::Closing);
-		if (auto transport = impl()->getWsTransport())
-			transport->close();
-		else
-			impl()->changeState(State::Closed);
-	}
-}
+void WebSocket::close() { impl()->close(); }
 
 bool WebSocket::send(message_variant data) {
 	return impl()->outgoing(make_message(std::move(data)));