From 486067a4b2df585efb809fd01a4dea4fab121d23 Mon Sep 17 00:00:00 2001 From: Tomasz Sowa Date: Sat, 10 Apr 2021 17:14:51 +0200 Subject: [PATCH] clang thread sanitizer reported a data race in App::Start() synchro.was_stop_signal was read without locking ================== WARNING: ThreadSanitizer: data race (pid=13831) Write of size 1 at 0x000000dc4d18 by thread T1 (mutexes: write M44): #0 Winix::App::SpecialThreadForSignals(void*) /disk2Tc/home/tomek/roboczy/prog/winix/winixd/core/app.cpp:2226:31 (winix.so+0x1f7465) Previous read of size 1 at 0x000000dc4d18 by main thread: #0 Winix::App::Start() /disk2Tc/home/tomek/roboczy/prog/winix/winixd/core/app.cpp:651:18 (winix.so+0x1ee9af) #1 main /disk2Tc/home/tomek/roboczy/prog/winix/winixd/main/main.cpp:222:6 (winix+0x2d74c1) Location is global 'Winix::app' of size 65840 at 0x000000db5908 (winix+0x000000dc4d18) Mutex M44 (0x000000dc4d10) created at: #0 pthread_mutex_lock /disk2Tb/usr/src/contrib/llvm-project/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc:4153:3 (winix+0x2ac204) #1 Winix::Synchro::Lock() /disk2Tc/home/tomek/roboczy/prog/winix/winixd/core/synchro.cpp:68:12 (winix.so+0x2e5822) #2 Winix::Lock::Lock(Winix::Synchro*) /disk2Tc/home/tomek/roboczy/prog/winix/winixd/core/lock.cpp:53:11 (winix.so+0x295522) #3 Winix::FileLog::get_local_date(PT::Date const&) /disk2Tc/home/tomek/roboczy/prog/winix/winixd/core/filelog.cpp:98:8 (winix.so+0x261183) #4 Winix::Log::PrintDate(PT::Date const&) /disk2Tc/home/tomek/roboczy/prog/winix/winixd/core/log.cpp:80:30 (winix.so+0x295a21) #5 Winix::LogInfo(Winix::Log&, Winix::LogManipulators, char const*, bool, char const*) /disk2Tc/home/tomek/roboczy/prog/winix/winixd/main/main.cpp:104:6 (winix+0x2d69ec) #6 main /disk2Tc/home/tomek/roboczy/prog/winix/winixd/main/main.cpp:190:2 (winix+0x2d7363) Thread T1 (tid=100187, running) created by main thread at: #0 pthread_create /disk2Tb/usr/src/contrib/llvm-project/compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp:962:3 (winix+0x295bb3) #1 Winix::App::StartThreads() /disk2Tc/home/tomek/roboczy/prog/winix/winixd/core/app.cpp:2246:2 (winix.so+0x1f7549) #2 main /disk2Tc/home/tomek/roboczy/prog/winix/winixd/main/main.cpp:212:6 (winix+0x2d743e) SUMMARY: ThreadSanitizer: data race /disk2Tc/home/tomek/roboczy/prog/winix/winixd/core/app.cpp:2226:31 in Winix::App::SpecialThreadForSignals(void*) ================== --- winixd/core/app.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/winixd/core/app.cpp b/winixd/core/app.cpp index a501009..1cb4f17 100644 --- a/winixd/core/app.cpp +++ b/winixd/core/app.cpp @@ -648,20 +648,26 @@ void App::ClearAfterRequest() void App::Start() { - while( !synchro.was_stop_signal && FCGX_Accept_r(&fcgi_request) == 0 ) + bool was_stop_signal = false; + { - Lock(); + Winix::Lock lock(synchro); + was_stop_signal = synchro.was_stop_signal; + } + + while( !was_stop_signal && FCGX_Accept_r(&fcgi_request) == 0 ) + { + Winix::Lock lock(synchro); if( synchro.was_stop_signal ) { + was_stop_signal = true; FCGX_Finish_r(&fcgi_request); } else { ProcessRequest(); } - - Unlock(); } }