Hi,
We have played with the TSan (Thread Sanitizer
https://code.google.com/p/thread-sanitizer/) and discover some warning that we
were interested in sharing to see if others have opinion on the matter.
If you are interested I could try to do an example to reproduce the warning.
The code simply create a thread and call ev::async::send().
Here's the log:
==================
WARNING: ThreadSanitizer: data race (pid=22551)
Write of size 4 at 0x7f1bb4ba4afc by thread T1:
#0 evpipe_write ev.c:0 (libev.so.4+0x000000005c76)
#1 ev_async_send ??:0 (libev.so.4+0x00000003ed68)
#2 ev::async::send()
/home/builder/rogue_nightly_build/scratch/ubuntu-utests-nirs-TSan-x86_64-clang-Debug-bin/externalProjects/Install/LibEv/include/ev++.h:799
(exe+0x0000000ace06)
#3 NDEventManager::SetAsyncEventWatcher(RRBaseObject*)
/home/builder/rogue_nightly_build/working_copy/NIRS/trunk/Code/Embedded/NIRSDaemon/NDEventManager.cxx:505
(exe+0x0000000aa7bf)
#4 NDNotification::RunNotificationThread()
/home/builder/rogue_nightly_build/working_copy/NIRS/trunk/Code/Embedded/UnitTests/UT_NDEventManager.cxx:76
(exe+0x00000009e8b6)
#5 NDNotification::NotificationThread(void*)
/home/builder/rogue_nightly_build/working_copy/NIRS/trunk/Code/Embedded/UnitTests/UT_NDEventManager.cxx:62
(exe+0x00000009e4ae)
Previous read of size 4 at 0x7f1bb4ba4afc by main thread:
#0 ev_run ??:0 (libev.so.4+0x000000018dbd)
#1 ev::loop_ref::run(int)
/home/builder/rogue_nightly_build/scratch/ubuntu-utests-nirs-TSan-x86_64-clang-Debug-bin/externalProjects/Install/LibEv/include/ev++.h:212
(exe+0x0000000ab046)
#2 NDEventManager::Run()
/home/builder/rogue_nightly_build/working_copy/NIRS/trunk/Code/Embedded/NIRSDaemon/NDEventManager.cxx:73
(exe+0x0000000a3634)
#3 NDEventManager_TestEventTypeAsync_Test::TestBody()
/home/builder/rogue_nightly_build/working_copy/NIRS/trunk/Code/Embedded/UnitTests/UT_NDEventManager.cxx:200
(exe+0x00000008bf2c)
#4 void
testing::internal::HandleSehExceptionsInMethodIfSupported<testing::Test,
void>(testing::Test*, void (testing::Test::*)(), char const*) ??:0
(exe+0x0000001a6a82)
#5 void
testing::internal::HandleExceptionsInMethodIfSupported<testing::Test,
void>(testing::Test*, void (testing::Test::*)(), char const*) ??:0
(exe+0x00000014b51e)
#6 testing::Test::Run() ??:0 (exe+0x0000000fad43)
#7 testing::TestInfo::Run() ??:0 (exe+0x0000000fe5fd)
#8 testing::TestCase::Run() ??:0 (exe+0x000000100658)
#9 testing::internal::UnitTestImpl::RunAllTests() ??:0 (exe+0x000000118a8a)
#10 bool
testing::internal::HandleSehExceptionsInMethodIfSupported<testing::internal::UnitTestImpl,
bool>(testing::internal::UnitTestImpl*, bool
(testing::internal::UnitTestImpl::*)(), char const*) ??:0 (exe+0x000000192a92)
#11 bool
testing::internal::HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl,
bool>(testing::internal::UnitTestImpl*, bool
(testing::internal::UnitTestImpl::*)(), char const*) ??:0 (exe+0x00000015662e)
#12 testing::UnitTest::Run() ??:0 (exe+0x000000117922)
#13 main ??:0 (exe+0x0000001d54be)
Thread T1 (tid=22553, running) created by main thread at:
#0 pthread_create
/home/builder/rogue_nightly_build/build_utils/llvm/llvm/projects/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc:812
(exe+0x0000000506c7)
#1 NDNotification::UpdateSubscriber(RRBaseObject*)
/home/builder/rogue_nightly_build/working_copy/NIRS/trunk/Code/Embedded/UnitTests/UT_NDEventManager.cxx:126
(exe+0x00000009cbd0)
#2 non-virtual thunk to NDNotification::UpdateSubscriber(RRBaseObject*)
/home/builder/rogue_nightly_build/working_copy/NIRS/trunk/Code/Embedded/UnitTests/UT_NDEventManager.cxx:158
(exe+0x00000009dfe7)
#3 RRPublisher::Notify(RRBaseObject*)
/home/builder/rogue_nightly_build/working_copy/Shared/Code/trunk/RRPublisher.cxx:176
(exe+0x0000000c3841)
#4 NDEventManager::EventTimerCallback(ev::timer&, int)
/home/builder/rogue_nightly_build/working_copy/NIRS/trunk/Code/Embedded/NIRSDaemon/NDEventManager.cxx:459
(exe+0x0000000a9aff)
#5 void ev::base<ev_timer, ev::timer>::method_thunk<NDEventManager,
&NDEventManager::EventTimerCallback>(ev_loop*, ev_timer*, int)
/home/builder/rogue_nightly_build/scratch/ubuntu-utests-nirs-TSan-x86_64-clang-Debug-bin/externalProjects/Install/LibEv/include/ev++.h:480
(exe+0x0000000b4f89)
#6 ev_invoke_pending ??:0 (libev.so.4+0x000000017900)
#7 ev_run ??:0 (libev.so.4+0x00000001a9e4)
#8 ev::loop_ref::run(int)
/home/builder/rogue_nightly_build/scratch/ubuntu-utests-nirs-TSan-x86_64-clang-Debug-bin/externalProjects/Install/LibEv/include/ev++.h:212
(exe+0x0000000ab046)
#9 NDEventManager::Run()
/home/builder/rogue_nightly_build/working_copy/NIRS/trunk/Code/Embedded/NIRSDaemon/NDEventManager.cxx:73
(exe+0x0000000a3634)
#10 NDEventManager_TestEventTypeAsync_Test::TestBody()
/home/builder/rogue_nightly_build/working_copy/NIRS/trunk/Code/Embedded/UnitTests/UT_NDEventManager.cxx:200
(exe+0x00000008bf2c)
#11 void
testing::internal::HandleSehExceptionsInMethodIfSupported<testing::Test,
void>(testing::Test*, void (testing::Test::*)(), char const*) ??:0
(exe+0x0000001a6a82)
#12 void
testing::internal::HandleExceptionsInMethodIfSupported<testing::Test,
void>(testing::Test*, void (testing::Test::*)(), char const*) ??:0
(exe+0x00000014b51e)
#13 testing::Test::Run() ??:0 (exe+0x0000000fad43)
#14 testing::TestInfo::Run() ??:0 (exe+0x0000000fe5fd)
#15 testing::TestCase::Run() ??:0 (exe+0x000000100658)
#16 testing::internal::UnitTestImpl::RunAllTests() ??:0 (exe+0x000000118a8a)
#17 bool
testing::internal::HandleSehExceptionsInMethodIfSupported<testing::internal::UnitTestImpl,
bool>(testing::internal::UnitTestImpl*, bool
(testing::internal::UnitTestImpl::*)(), char const*) ??:0 (exe+0x000000192a92)
#18 bool
testing::internal::HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl,
bool>(testing::internal::UnitTestImpl*, bool
(testing::internal::UnitTestImpl::*)(), char const*) ??:0 (exe+0x00000015662e)
#19 testing::UnitTest::Run() ??:0 (exe+0x000000117922)
#20 main ??:0 (exe+0x0000001d54be)
SUMMARY: ThreadSanitizer: data race ev.c:0 evpipe_write
==================
==================
WARNING: ThreadSanitizer: data race (pid=22551)
Write of size 4 at 0x7f1bb4ba4c38 by main thread:
#0 pipecb ev.c:0 (libev.so.4+0x0000000483cd)
#1 ev_invoke_pending ??:0 (libev.so.4+0x000000017900)
#2 ev_run ??:0 (libev.so.4+0x00000001a9e4)
#3 ev::loop_ref::run(int)
/home/builder/rogue_nightly_build/scratch/ubuntu-utests-nirs-TSan-x86_64-clang-Debug-bin/externalProjects/Install/LibEv/include/ev++.h:212
(exe+0x0000000ab046)
#4 NDEventManager::Run()
/home/builder/rogue_nightly_build/working_copy/NIRS/trunk/Code/Embedded/NIRSDaemon/NDEventManager.cxx:73
(exe+0x0000000a3634)
#5 NDEventManager_TestEventTypeAsync_Test::TestBody()
/home/builder/rogue_nightly_build/working_copy/NIRS/trunk/Code/Embedded/UnitTests/UT_NDEventManager.cxx:200
(exe+0x00000008bf2c)
#6 void
testing::internal::HandleSehExceptionsInMethodIfSupported<testing::Test,
void>(testing::Test*, void (testing::Test::*)(), char const*) ??:0
(exe+0x0000001a6a82)
#7 void
testing::internal::HandleExceptionsInMethodIfSupported<testing::Test,
void>(testing::Test*, void (testing::Test::*)(), char const*) ??:0
(exe+0x00000014b51e)
#8 testing::Test::Run() ??:0 (exe+0x0000000fad43)
#9 testing::TestInfo::Run() ??:0 (exe+0x0000000fe5fd)
#10 testing::TestCase::Run() ??:0 (exe+0x000000100658)
#11 testing::internal::UnitTestImpl::RunAllTests() ??:0 (exe+0x000000118a8a)
#12 bool
testing::internal::HandleSehExceptionsInMethodIfSupported<testing::internal::UnitTestImpl,
bool>(testing::internal::UnitTestImpl*, bool
(testing::internal::UnitTestImpl::*)(), char const*) ??:0 (exe+0x000000192a92)
#13 bool
testing::internal::HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl,
bool>(testing::internal::UnitTestImpl*, bool
(testing::internal::UnitTestImpl::*)(), char const*) ??:0 (exe+0x00000015662e)
#14 testing::UnitTest::Run() ??:0 (exe+0x000000117922)
#15 main ??:0 (exe+0x0000001d54be)
Previous read of size 4 at 0x7f1bb4ba4c38 by thread T1:
#0 evpipe_write ev.c:0 (libev.so.4+0x000000005b48)
#1 ev_async_send ??:0 (libev.so.4+0x00000003ed68)
#2 ev::async::send()
/home/builder/rogue_nightly_build/scratch/ubuntu-utests-nirs-TSan-x86_64-clang-Debug-bin/externalProjects/Install/LibEv/include/ev++.h:799
(exe+0x0000000ace06)
#3 NDEventManager::SetAsyncEventWatcher(RRBaseObject*)
/home/builder/rogue_nightly_build/working_copy/NIRS/trunk/Code/Embedded/NIRSDaemon/NDEventManager.cxx:505
(exe+0x0000000aa7bf)
#4 NDNotification::RunNotificationThread()
/home/builder/rogue_nightly_build/working_copy/NIRS/trunk/Code/Embedded/UnitTests/UT_NDEventManager.cxx:76
(exe+0x00000009e8b6)
#5 NDNotification::NotificationThread(void*)
/home/builder/rogue_nightly_build/working_copy/NIRS/trunk/Code/Embedded/UnitTests/UT_NDEventManager.cxx:62
(exe+0x00000009e4ae)
Thread T1 (tid=22553, running) created by main thread at:
#0 pthread_create
/home/builder/rogue_nightly_build/build_utils/llvm/llvm/projects/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc:812
(exe+0x0000000506c7)
#1 NDNotification::UpdateSubscriber(RRBaseObject*)
/home/builder/rogue_nightly_build/working_copy/NIRS/trunk/Code/Embedded/UnitTests/UT_NDEventManager.cxx:126
(exe+0x00000009cbd0)
#2 non-virtual thunk to NDNotification::UpdateSubscriber(RRBaseObject*)
/home/builder/rogue_nightly_build/working_copy/NIRS/trunk/Code/Embedded/UnitTests/UT_NDEventManager.cxx:158
(exe+0x00000009dfe7)
#3 RRPublisher::Notify(RRBaseObject*)
/home/builder/rogue_nightly_build/working_copy/Shared/Code/trunk/RRPublisher.cxx:176
(exe+0x0000000c3841)
#4 NDEventManager::EventTimerCallback(ev::timer&, int)
/home/builder/rogue_nightly_build/working_copy/NIRS/trunk/Code/Embedded/NIRSDaemon/NDEventManager.cxx:459
(exe+0x0000000a9aff)
#5 void ev::base<ev_timer, ev::timer>::method_thunk<NDEventManager,
&NDEventManager::EventTimerCallback>(ev_loop*, ev_timer*, int)
/home/builder/rogue_nightly_build/scratch/ubuntu-utests-nirs-TSan-x86_64-clang-Debug-bin/externalProjects/Install/LibEv/include/ev++.h:480
(exe+0x0000000b4f89)
#6 ev_invoke_pending ??:0 (libev.so.4+0x000000017900)
#7 ev_run ??:0 (libev.so.4+0x00000001a9e4)
#8 ev::loop_ref::run(int)
/home/builder/rogue_nightly_build/scratch/ubuntu-utests-nirs-TSan-x86_64-clang-Debug-bin/externalProjects/Install/LibEv/include/ev++.h:212
(exe+0x0000000ab046)
#9 NDEventManager::Run()
/home/builder/rogue_nightly_build/working_copy/NIRS/trunk/Code/Embedded/NIRSDaemon/NDEventManager.cxx:73
(exe+0x0000000a3634)
#10 NDEventManager_TestEventTypeAsync_Test::TestBody()
/home/builder/rogue_nightly_build/working_copy/NIRS/trunk/Code/Embedded/UnitTests/UT_NDEventManager.cxx:200
(exe+0x00000008bf2c)
#11 void
testing::internal::HandleSehExceptionsInMethodIfSupported<testing::Test,
void>(testing::Test*, void (testing::Test::*)(), char const*) ??:0
(exe+0x0000001a6a82)
#12 void
testing::internal::HandleExceptionsInMethodIfSupported<testing::Test,
void>(testing::Test*, void (testing::Test::*)(), char const*) ??:0
(exe+0x00000014b51e)
#13 testing::Test::Run() ??:0 (exe+0x0000000fad43)
#14 testing::TestInfo::Run() ??:0 (exe+0x0000000fe5fd)
#15 testing::TestCase::Run() ??:0 (exe+0x000000100658)
#16 testing::internal::UnitTestImpl::RunAllTests() ??:0 (exe+0x000000118a8a)
#17 bool
testing::internal::HandleSehExceptionsInMethodIfSupported<testing::internal::UnitTestImpl,
bool>(testing::internal::UnitTestImpl*, bool
(testing::internal::UnitTestImpl::*)(), char const*) ??:0 (exe+0x000000192a92)
#18 bool
testing::internal::HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl,
bool>(testing::internal::UnitTestImpl*, bool
(testing::internal::UnitTestImpl::*)(), char const*) ??:0 (exe+0x00000015662e)
#19 testing::UnitTest::Run() ??:0 (exe+0x000000117922)
#20 main ??:0 (exe+0x0000001d54be)
SUMMARY: ThreadSanitizer: data race ev.c:0 pipecb
==================
Let's me know if you will be interested in a example to reproduce the warning?
Best Regards,
-KA
_______________________________________________
libev mailing list
[email protected]
http://lists.schmorp.de/cgi-bin/mailman/listinfo/libev