Skip to content

Instantly share code, notes, and snippets.

@xanderdunn
Created April 28, 2021 21:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save xanderdunn/f5ca78932f3ae8642fe59b6aa0e9705f to your computer and use it in GitHub Desktop.
Save xanderdunn/f5ca78932f3ae8642fe59b6aa0e9705f to your computer and use it in GitHub Desktop.
Minimal quill Example Thread Sanitizer output
==================
WARNING: ThreadSanitizer: data race (pid=30925)
Read of size 8 at 0x7b04000004a0 by thread T1:
#0 std::__shared_ptr<quill::detail::ThreadContext, (__gnu_cxx::_Lock_policy)2>::get() const <null> (test.exe+0x11e36)
#1 quill::detail::ThreadContextCollection::backend_thread_contexts_cache() /home/xander/dev/vcpkg/buildtrees/quill/src/v1.6.2-b72390cb62.clean/quill/src/detail/ThreadContextCollection.cpp:67 (test.exe+0x52511)
#2 quill::detail::BackendWorker::run()::{lambda()#1}::operator()() const::{lambda()#1}::operator()() const <null> (test.exe+0xe1a6)
#3 void std::__invoke_impl<void, quill::detail::BackendWorker::run()::{lambda()#1}::operator()() const::{lambda()#1}>(std::__invoke_other, quill::detail::BackendWorker::run()::{lambda()#1}::operator()() const::{lambda()#1}&&) <null> (test.exe+0x25d8c)
#4 std::__invoke_result<quill::detail::BackendWorker::run()::{lambda()#1}::operator()() const::{lambda()#1}>::type std::__invoke<quill::detail::BackendWorker::run()::{lambda()#1}::operator()() const::{lambda()#1}>(quill::detail::BackendWorker::run()::{lambda()#1}::operator()() const::{lambda()#1}&&, (std::__invoke_result&&)...) <null> (test.exe+0x257ec)
#5 void std::thread::_Invoker<std::tuple<quill::detail::BackendWorker::run()::{lambda()#1}::operator()() const::{lambda()#1}> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) <null> (test.exe+0x2546c)
#6 std::thread::_Invoker<std::tuple<quill::detail::BackendWorker::run()::{lambda()#1}::operator()() const::{lambda()#1}> >::operator()() <null> (test.exe+0x24bea)
#7 std::thread::_State_impl<std::thread::_Invoker<std::tuple<quill::detail::BackendWorker::run()::{lambda()#1}::operator()() const::{lambda()#1}> > >::_M_run() <null> (test.exe+0x23ec8)
#8 <null> <null> (libstdc++.so.6+0xd0e8f)
Previous write of size 8 at 0x7b04000004a0 by main thread:
#0 operator new(unsigned long) <null> (libtsan.so.0+0x8a2ce)
#1 __gnu_cxx::new_allocator<std::shared_ptr<quill::detail::ThreadContext> >::allocate(unsigned long, void const*) /usr/include/c++/10/ext/new_allocator.h:115 (test.exe+0x55b7f)
#2 initialize_logging() /home/xander/dev/my_model/test.cc:35 (test.exe+0xa3fe)
#3 main /home/xander/dev/my_model/test.cc:40 (test.exe+0xa5c2)
As if synchronized via sleep:
#0 nanosleep <null> (libtsan.so.0+0x61cbc)
#1 void std::this_thread::sleep_for<long, std::ratio<1l, 1000000000l> >(std::chrono::duration<long, std::ratio<1l, 1000000000l> > const&) <null> (test.exe+0x13e4f)
#2 quill::detail::BackendWorker::_main_loop() <null> (test.exe+0x108f7)
#3 quill::detail::BackendWorker::run()::{lambda()#1}::operator()() const::{lambda()#1}::operator()() const <null> (test.exe+0xe189)
#4 void std::__invoke_impl<void, quill::detail::BackendWorker::run()::{lambda()#1}::operator()() const::{lambda()#1}>(std::__invoke_other, quill::detail::BackendWorker::run()::{lambda()#1}::operator()() const::{lambda()#1}&&) <null> (test.exe+0x25d8c)
#5 std::__invoke_result<quill::detail::BackendWorker::run()::{lambda()#1}::operator()() const::{lambda()#1}>::type std::__invoke<quill::detail::BackendWorker::run()::{lambda()#1}::operator()() const::{lambda()#1}>(quill::detail::BackendWorker::run()::{lambda()#1}::operator()() const::{lambda()#1}&&, (std::__invoke_result&&)...) <null> (test.exe+0x257ec)
#6 void std::thread::_Invoker<std::tuple<quill::detail::BackendWorker::run()::{lambda()#1}::operator()() const::{lambda()#1}> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) <null> (test.exe+0x2546c)
#7 std::thread::_Invoker<std::tuple<quill::detail::BackendWorker::run()::{lambda()#1}::operator()() const::{lambda()#1}> >::operator()() <null> (test.exe+0x24bea)
#8 std::thread::_State_impl<std::thread::_Invoker<std::tuple<quill::detail::BackendWorker::run()::{lambda()#1}::operator()() const::{lambda()#1}> > >::_M_run() <null> (test.exe+0x23ec8)
#9 <null> <null> (libstdc++.so.6+0xd0e8f)
Location is heap block of size 16 at 0x7b04000004a0 allocated by main thread:
#0 operator new(unsigned long) <null> (libtsan.so.0+0x8a2ce)
#1 __gnu_cxx::new_allocator<std::shared_ptr<quill::detail::ThreadContext> >::allocate(unsigned long, void const*) /usr/include/c++/10/ext/new_allocator.h:115 (test.exe+0x55b7f)
#2 initialize_logging() /home/xander/dev/my_model/test.cc:35 (test.exe+0xa3fe)
#3 main /home/xander/dev/my_model/test.cc:40 (test.exe+0xa5c2)
Thread T1 'Quill_Backend' (tid=30927, running) created by main thread at:
#0 pthread_create <null> (libtsan.so.0+0x5d445)
#1 std::thread::_M_start_thread(std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State> >, void (*)()) <null> (libstdc++.so.6+0xd1124)
#2 quill::detail::BackendWorker::run()::{lambda()#1}::operator()() const <null> (test.exe+0xde88)
#3 void std::__invoke_impl<void, quill::detail::BackendWorker::run()::{lambda()#1}>(std::__invoke_other, quill::detail::BackendWorker::run()::{lambda()#1}&&) <null> (test.exe+0x1b0d7)
#4 std::__invoke_result<quill::detail::BackendWorker::run()::{lambda()#1}>::type std::__invoke<quill::detail::BackendWorker::run()::{lambda()#1}>(std::__invoke_result&&, (quill::detail::BackendWorker::run()::{lambda()#1}&&)...) <null> (test.exe+0x17155)
#5 std::call_once<quill::detail::BackendWorker::run()::{lambda()#1}>(std::once_flag&, quill::detail::BackendWorker::run()::{lambda()#1}&&)::{lambda()#1}::operator()() const <null> (test.exe+0x130f7)
#6 std::call_once<quill::detail::BackendWorker::run()::{lambda()#1}>(std::once_flag&, quill::detail::BackendWorker::run()::{lambda()#1}&&)::{lambda()#2}::operator()() const <null> (test.exe+0x1315e)
#7 std::call_once<quill::detail::BackendWorker::run()::{lambda()#1}>(std::once_flag&, quill::detail::BackendWorker::run()::{lambda()#1}&&)::{lambda()#2}::_FUN() <null> (test.exe+0x1319d)
#8 pthread_once <null> (libtsan.so.0+0x40784)
#9 __gthread_once(int*, void (*)()) <null> (test.exe+0xb577)
#10 void std::call_once<quill::detail::BackendWorker::run()::{lambda()#1}>(std::once_flag&, quill::detail::BackendWorker::run()::{lambda()#1}&&) <null> (test.exe+0x13290)
#11 quill::detail::BackendWorker::run() <null> (test.exe+0xe738)
#12 quill::detail::LogManager::start_backend_worker(bool, std::initializer_list<int> const&) <null> (test.exe+0x10aa5)
#13 quill::start(bool, std::initializer_list<int>) <null> (test.exe+0x10b5b)
#14 initialize_logging() /home/xander/dev/my_model/test.cc:30 (test.exe+0xa33a)
#15 main /home/xander/dev/my_model/test.cc:40 (test.exe+0xa5c2)
SUMMARY: ThreadSanitizer: data race (/home/xander/dev/my_model/test.exe+0x11e36) in std::__shared_ptr<quill::detail::ThreadContext, (__gnu_cxx::_Lock_policy)2>::get() const
==================
==================
WARNING: ThreadSanitizer: data race (pid=30925)
Read of size 8 at 0x7b4800000100 by thread T1:
#0 quill::detail::BackendWorker::_read_event_queue(quill::detail::ThreadContext*) <null> (test.exe+0xe9fa)
#1 quill::detail::BackendWorker::_populate_priority_queue(std::vector<quill::detail::ThreadContext*, quill::detail::CacheAlignedAllocator<quill::detail::ThreadContext*> > const&) <null> (test.exe+0xe914)
#2 quill::detail::BackendWorker::_exit() <null> (test.exe+0x109bf)
#3 quill::detail::BackendWorker::run()::{lambda()#1}::operator()() const::{lambda()#1}::operator()() const <null> (test.exe+0xe1a6)
#4 void std::__invoke_impl<void, quill::detail::BackendWorker::run()::{lambda()#1}::operator()() const::{lambda()#1}>(std::__invoke_other, quill::detail::BackendWorker::run()::{lambda()#1}::operator()() const::{lambda()#1}&&) <null> (test.exe+0x25d8c)
#5 std::__invoke_result<quill::detail::BackendWorker::run()::{lambda()#1}::operator()() const::{lambda()#1}>::type std::__invoke<quill::detail::BackendWorker::run()::{lambda()#1}::operator()() const::{lambda()#1}>(quill::detail::BackendWorker::run()::{lambda()#1}::operator()() const::{lambda()#1}&&, (std::__invoke_result&&)...) <null> (test.exe+0x257ec)
#6 void std::thread::_Invoker<std::tuple<quill::detail::BackendWorker::run()::{lambda()#1}::operator()() const::{lambda()#1}> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) <null> (test.exe+0x2546c)
#7 std::thread::_Invoker<std::tuple<quill::detail::BackendWorker::run()::{lambda()#1}::operator()() const::{lambda()#1}> >::operator()() <null> (test.exe+0x24bea)
#8 std::thread::_State_impl<std::thread::_Invoker<std::tuple<quill::detail::BackendWorker::run()::{lambda()#1}::operator()() const::{lambda()#1}> > >::_M_run() <null> (test.exe+0x23ec8)
#9 <null> <null> (libstdc++.so.6+0xd0e8f)
Previous write of size 8 at 0x7b4800000100 by main thread:
#0 posix_memalign <null> (libtsan.so.0+0x2f579)
#1 quill::detail::aligned_alloc(unsigned long, unsigned long) /home/xander/dev/vcpkg/buildtrees/quill/src/v1.6.2-b72390cb62.clean/quill/src/detail/misc/Os.cpp:254 (test.exe+0x3923d)
#2 initialize_logging() /home/xander/dev/my_model/test.cc:35 (test.exe+0xa3fe)
#3 main /home/xander/dev/my_model/test.cc:40 (test.exe+0xa5c2)
As if synchronized via sleep:
#0 nanosleep <null> (libtsan.so.0+0x61cbc)
#1 void std::this_thread::sleep_for<long, std::ratio<1l, 1000000000l> >(std::chrono::duration<long, std::ratio<1l, 1000000000l> > const&) <null> (test.exe+0x13e4f)
#2 quill::detail::BackendWorker::_main_loop() <null> (test.exe+0x108f7)
#3 quill::detail::BackendWorker::run()::{lambda()#1}::operator()() const::{lambda()#1}::operator()() const <null> (test.exe+0xe189)
#4 void std::__invoke_impl<void, quill::detail::BackendWorker::run()::{lambda()#1}::operator()() const::{lambda()#1}>(std::__invoke_other, quill::detail::BackendWorker::run()::{lambda()#1}::operator()() const::{lambda()#1}&&) <null> (test.exe+0x25d8c)
#5 std::__invoke_result<quill::detail::BackendWorker::run()::{lambda()#1}::operator()() const::{lambda()#1}>::type std::__invoke<quill::detail::BackendWorker::run()::{lambda()#1}::operator()() const::{lambda()#1}>(quill::detail::BackendWorker::run()::{lambda()#1}::operator()() const::{lambda()#1}&&, (std::__invoke_result&&)...) <null> (test.exe+0x257ec)
#6 void std::thread::_Invoker<std::tuple<quill::detail::BackendWorker::run()::{lambda()#1}::operator()() const::{lambda()#1}> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) <null> (test.exe+0x2546c)
#7 std::thread::_Invoker<std::tuple<quill::detail::BackendWorker::run()::{lambda()#1}::operator()() const::{lambda()#1}> >::operator()() <null> (test.exe+0x24bea)
#8 std::thread::_State_impl<std::thread::_Invoker<std::tuple<quill::detail::BackendWorker::run()::{lambda()#1}::operator()() const::{lambda()#1}> > >::_M_run() <null> (test.exe+0x23ec8)
#9 <null> <null> (libstdc++.so.6+0xd0e8f)
Location is heap block of size 384 at 0x7b4800000000 allocated by main thread:
#0 posix_memalign <null> (libtsan.so.0+0x2f579)
#1 quill::detail::aligned_alloc(unsigned long, unsigned long) /home/xander/dev/vcpkg/buildtrees/quill/src/v1.6.2-b72390cb62.clean/quill/src/detail/misc/Os.cpp:254 (test.exe+0x3923d)
#2 initialize_logging() /home/xander/dev/my_model/test.cc:35 (test.exe+0xa3fe)
#3 main /home/xander/dev/my_model/test.cc:40 (test.exe+0xa5c2)
Thread T1 'Quill_Backend' (tid=30927, running) created by main thread at:
#0 pthread_create <null> (libtsan.so.0+0x5d445)
#1 std::thread::_M_start_thread(std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State> >, void (*)()) <null> (libstdc++.so.6+0xd1124)
#2 quill::detail::BackendWorker::run()::{lambda()#1}::operator()() const <null> (test.exe+0xde88)
#3 void std::__invoke_impl<void, quill::detail::BackendWorker::run()::{lambda()#1}>(std::__invoke_other, quill::detail::BackendWorker::run()::{lambda()#1}&&) <null> (test.exe+0x1b0d7)
#4 std::__invoke_result<quill::detail::BackendWorker::run()::{lambda()#1}>::type std::__invoke<quill::detail::BackendWorker::run()::{lambda()#1}>(std::__invoke_result&&, (quill::detail::BackendWorker::run()::{lambda()#1}&&)...) <null> (test.exe+0x17155)
#5 std::call_once<quill::detail::BackendWorker::run()::{lambda()#1}>(std::once_flag&, quill::detail::BackendWorker::run()::{lambda()#1}&&)::{lambda()#1}::operator()() const <null> (test.exe+0x130f7)
#6 std::call_once<quill::detail::BackendWorker::run()::{lambda()#1}>(std::once_flag&, quill::detail::BackendWorker::run()::{lambda()#1}&&)::{lambda()#2}::operator()() const <null> (test.exe+0x1315e)
#7 std::call_once<quill::detail::BackendWorker::run()::{lambda()#1}>(std::once_flag&, quill::detail::BackendWorker::run()::{lambda()#1}&&)::{lambda()#2}::_FUN() <null> (test.exe+0x1319d)
#8 pthread_once <null> (libtsan.so.0+0x40784)
#9 __gthread_once(int*, void (*)()) <null> (test.exe+0xb577)
#10 void std::call_once<quill::detail::BackendWorker::run()::{lambda()#1}>(std::once_flag&, quill::detail::BackendWorker::run()::{lambda()#1}&&) <null> (test.exe+0x13290)
#11 quill::detail::BackendWorker::run() <null> (test.exe+0xe738)
#12 quill::detail::LogManager::start_backend_worker(bool, std::initializer_list<int> const&) <null> (test.exe+0x10aa5)
#13 quill::start(bool, std::initializer_list<int>) <null> (test.exe+0x10b5b)
#14 initialize_logging() /home/xander/dev/my_model/test.cc:30 (test.exe+0xa33a)
#15 main /home/xander/dev/my_model/test.cc:40 (test.exe+0xa5c2)
SUMMARY: ThreadSanitizer: data race (/home/xander/dev/my_model/test.exe+0xe9fa) in quill::detail::BackendWorker::_read_event_queue(quill::detail::ThreadContext*)
==================
ThreadSanitizer: reported 2 warnings
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment