summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrii Kalinich (GitHub) <AKalinich@luxoft.com>2020-10-01 09:09:36 -0400
committerGitHub <noreply@github.com>2020-10-01 09:09:36 -0400
commit46f3bfa03c7eeb63499fd6a8c6430cd693646247 (patch)
tree1d400b65d08430e9ec8cce94eb3567fc1396309b
parent876856f1f2a6956bb6d14f32a26d484c0fd52499 (diff)
downloadsdl_core-46f3bfa03c7eeb63499fd6a8c6430cd693646247.tar.gz
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_
-rw-r--r--src/components/transport_manager/include/transport_manager/tcp/tcp_client_listener.h7
-rw-r--r--src/components/transport_manager/src/tcp/tcp_client_listener.cc10
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 <atomic>
+
#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");