From 46f3bfa03c7eeb63499fd6a8c6430cd693646247 Mon Sep 17 00:00:00 2001 From: "Andrii Kalinich (GitHub)" Date: Thu, 1 Oct 2020 09:09:36 -0400 Subject: Fix data races in TcpClientListener (#3495) Regarding of Helgrind report. Changed type of TcpClientListener::thread_stop_requested_ from bool to std::atomic_bool. The same for remove_devices_on_terminate_ --- .../include/transport_manager/tcp/tcp_client_listener.h | 7 +++++-- .../transport_manager/src/tcp/tcp_client_listener.cc | 10 +++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/components/transport_manager/include/transport_manager/tcp/tcp_client_listener.h b/src/components/transport_manager/include/transport_manager/tcp/tcp_client_listener.h index 9eea8389e6..30ecf1a277 100644 --- a/src/components/transport_manager/include/transport_manager/tcp/tcp_client_listener.h +++ b/src/components/transport_manager/include/transport_manager/tcp/tcp_client_listener.h @@ -37,6 +37,9 @@ #define SRC_COMPONENTS_TRANSPORT_MANAGER_INCLUDE_TRANSPORT_MANAGER_TCP_TCP_CLIENT_LISTENER_H_ #include "transport_manager/transport_adapter/client_connection_listener.h" + +#include + #include "utils/lock.h" #include "utils/threads/thread_delegate.h" @@ -149,8 +152,8 @@ class TcpClientListener : public ClientConnectionListener { bool started_; threads::Thread* thread_; int socket_; - bool thread_stop_requested_; - bool remove_devices_on_terminate_; + std::atomic_bool thread_stop_requested_; + std::atomic_bool remove_devices_on_terminate_; int pipe_fds_[2]; NetworkInterfaceListener* interface_listener_; const std::string designated_interface_; diff --git a/src/components/transport_manager/src/tcp/tcp_client_listener.cc b/src/components/transport_manager/src/tcp/tcp_client_listener.cc index 0812cd39c9..2683ce02c4 100644 --- a/src/components/transport_manager/src/tcp/tcp_client_listener.cc +++ b/src/components/transport_manager/src/tcp/tcp_client_listener.cc @@ -97,7 +97,7 @@ TcpClientListener::TcpClientListener(TransportAdapterController* controller, TransportAdapter::Error TcpClientListener::Init() { SDL_LOG_AUTO_TRACE(); - thread_stop_requested_ = false; + thread_stop_requested_.store(false); if (!IsListeningOnSpecificInterface()) { // Network interface is not specified. We will listen on all interfaces @@ -343,7 +343,7 @@ void TcpClientListener::StopLoop() { return; } - thread_stop_requested_ = true; + thread_stop_requested_.store(true); char dummy[1] = {0}; int ret = write(pipe_fds_[1], dummy, sizeof(dummy)); @@ -459,7 +459,7 @@ TransportAdapter::Error TcpClientListener::StartListeningThread() { } } - thread_stop_requested_ = false; + thread_stop_requested_.store(false); if (!thread_->Start()) { return TransportAdapter::FAIL; @@ -538,7 +538,7 @@ bool TcpClientListener::StartOnNetworkInterface() { } } - remove_devices_on_terminate_ = true; + remove_devices_on_terminate_.store(true); if (TransportAdapter::OK != StartListeningThread()) { SDL_LOG_WARN("Failed to start TCP client listener"); @@ -564,7 +564,7 @@ bool TcpClientListener::StopOnNetworkInterface() { socket_ = -1; } - remove_devices_on_terminate_ = false; + remove_devices_on_terminate_.store(false); SDL_LOG_INFO("TCP server socket on " << designated_interface_ << " stopped"); -- cgit v1.2.1