Segmentation fault race condition in ReusableThread
daqling::utilities::ReusableThread::set_work(const std::function<void()>&)
has a segfault race condition. Backtrace is as follows:
#0 0x00007ffff79c6930 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1 0x00007ffff684b62c in __gthread_cond_wait (__mutex=<optimized out>, __cond=<optimized out>) at /home/abuild/rpmbuild/BUILD/gcc-8.3.0/obj/x86_64-pc-linux-gnu/libstdc++-v3/include/x86_64-pc-linux-gnu/bits/gthr-default.h:864
#2 std::condition_variable::wait (this=<optimized out>, __lock=...) at ../../../../../libstdc++-v3/src/c++11/condition_variable.cc:53
#3 0x00000000004cad9c in daqling::utilities::ReusableThread::thread_worker (this=0x7fffdc03b580) at /afs/cern.ch/user/v/vsoneste/daqling/src/Core/../../include/Utilities/ReusableThread.hpp:93
#4 0x00000000004d887b in std::__invoke_impl<void, void (daqling::utilities::ReusableThread::*)(), daqling::utilities::ReusableThread*>(std::__invoke_memfun_deref, void (daqling::utilities::ReusableThread::*&&)(), daqling::utilities::ReusableThread*&&) (__f=<unknown type in /afs/cern.ch/user/v/vsoneste/daqling/build/bin/main_core, CU 0x0, DIE 0xde702>, __t=<unknown type in /afs/cern.ch/user/v/vsoneste/daqling/build/bin/main_core, CU 0x0, DIE 0xde711>) at /opt/ohpc/pub/compiler/gcc/8.3.0/include/c++/8.3.0/bits/invoke.h:73
#5 0x00000000004d1906 in std::__invoke<void (daqling::utilities::ReusableThread::*)(), daqling::utilities::ReusableThread*>(void (daqling::utilities::ReusableThread::*&&)(), daqling::utilities::ReusableThread*&&) (__fn=<unknown type in /afs/cern.ch/user/v/vsoneste/daqling/build/bin/main_core, CU 0x0, DIE 0xe8cf6>, __args#0=<unknown type in /afs/cern.ch/user/v/vsoneste/daqling/build/bin/main_core, CU 0x0, DIE 0xe8d13>) at /opt/ohpc/pub/compiler/gcc/8.3.0/include/c++/8.3.0/bits/invoke.h:95
#6 0x00000000005041ef in std::thread::_Invoker<std::tuple<void (daqling::utilities::ReusableThread::*)(), daqling::utilities::ReusableThread*> >::_M_invoke<0ul, 1ul> (this=0x7fffdc013a28) at /opt/ohpc/pub/compiler/gcc/8.3.0/include/c++/8.3.0/thread:244
#7 0x0000000000503f78 in std::thread::_Invoker<std::tuple<void (daqling::utilities::ReusableThread::*)(), daqling::utilities::ReusableThread*> >::operator() (this=0x7fffdc013a28) at /opt/ohpc/pub/compiler/gcc/8.3.0/include/c++/8.3.0/thread:253
#8 0x0000000000503bd8 in std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (daqling::utilities::ReusableThread::*)(), daqling::utilities::ReusableThread*> > >::_M_run (this=0x7fffdc013a20) at /opt/ohpc/pub/compiler/gcc/8.3.0/include/c++/8.3.0/thread:196
#9 0x00007ffff6850d9f in execute_native_thread_routine () at ../../../../../libstdc++-v3/src/c++11/thread.cc:80
#10 0x00007ffff79c2dd5 in start_thread () from /lib64/libpthread.so.0
#11 0x00007ffff5fad02d in clone () from /lib64/libc.so.6
Offending line of code is m_cv.wait(lock);
in thread_worker
.