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 libev@lists.schmorp.de http://lists.schmorp.de/cgi-bin/mailman/listinfo/libev