diff --git a/ixwebsocket/IXWebSocketTransport.cpp b/ixwebsocket/IXWebSocketTransport.cpp index f9d36c52..23072f34 100644 --- a/ixwebsocket/IXWebSocketTransport.cpp +++ b/ixwebsocket/IXWebSocketTransport.cpp @@ -205,6 +205,12 @@ namespace ix void WebSocketTransport::setReadyState(ReadyState readyState) { + // Lock the _setReadyStateMutex for the duration of this + // method. This ensures that only a single thread runs the + // logic below avoiding concurrent execution of the + // close callback my multiple threads at the same time. + std::lock_guard lock(_setReadyStateMutex); + // No state change, return if (_readyState == readyState) return; diff --git a/ixwebsocket/IXWebSocketTransport.h b/ixwebsocket/IXWebSocketTransport.h index 8473c55c..97cfc15a 100644 --- a/ixwebsocket/IXWebSocketTransport.h +++ b/ixwebsocket/IXWebSocketTransport.h @@ -185,6 +185,8 @@ namespace ix // Hold the state of the connection (OPEN, CLOSED, etc...) std::atomic _readyState; + // Mutex to serialize setReadyState() execution. + std::mutex _setReadyStateMutex; OnCloseCallback _onCloseCallback; std::string _closeReason;