Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ThreadSanitizer race conditions in nested mode #57

Open
emersion opened this issue May 19, 2020 · 0 comments
Open

ThreadSanitizer race conditions in nested mode #57

emersion opened this issue May 19, 2020 · 0 comments
Labels
bug Something isn't working nested Nested mode via X11/Wayland

Comments

@emersion
Copy link
Collaborator

emersion commented May 19, 2020

In nested mode:

==================
WARNING: ThreadSanitizer: unlock of an unlocked mutex (or by a wrong thread) (pid=121151)
    #0 pthread_mutex_unlock /build/gcc/src/gcc/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:4162 (libtsan.so.0+0x3a68e)
    #1 __gthread_mutex_unlock /usr/include/c++/10.1.0/x86_64-pc-linux-gnu/bits/gthr-default.h:779 (gamescope+0x26ec8)
    #2 std::mutex::unlock() /usr/include/c++/10.1.0/bits/std_mutex.h:118 (gamescope+0x27085)
    #3 inputSDLThreadRun() ../src/inputsdl.cpp:363 (gamescope+0x46a0f)
    #4 void std::__invoke_impl<void, void (*)()>(std::__invoke_other, void (*&&)()) /usr/include/c++/10.1.0/bits/invoke.h:60 (gamescope+0x38408)
    #5 std::__invoke_result<void (*)()>::type std::__invoke<void (*)()>(void (*&&)()) /usr/include/c++/10.1.0/bits/invoke.h:95 (gamescope+0x3835f)
    #6 void std::thread::_Invoker<std::tuple<void (*)()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) /usr/include/c++/10.1.0/thread:264 (gamescope+0x382c4)
    #7 std::thread::_Invoker<std::tuple<void (*)()> >::operator()() /usr/include/c++/10.1.0/thread:271 (gamescope+0x3826e)
    #8 std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (*)()> > >::_M_run() /usr/include/c++/10.1.0/thread:215 (gamescope+0x380ae)
    #9 execute_native_thread_routine /build/gcc/src/gcc/libstdc++-v3/src/c++11/thread.cc:80 (libstdc++.so.6+0xcfb73)

  Location is global 'g_SDLInitLock' of size 40 at 0x561af0c0b420 (gamescope+0x00000010e420)

  Mutex M2051 (0x561af0c0b420) created at:
    #0 pthread_mutex_lock /build/gcc/src/gcc/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:4148 (libtsan.so.0+0x528ce)
    #1 __gthread_mutex_lock /usr/include/c++/10.1.0/x86_64-pc-linux-gnu/bits/gthr-default.h:749 (gamescope+0x26e7f)
    #2 std::mutex::lock() /usr/include/c++/10.1.0/bits/std_mutex.h:100 (gamescope+0x2702e)
    #3 inputsdl_init ../src/inputsdl.cpp:440 (gamescope+0x46e74)
    #4 initOutput ../src/main.cpp:140 (gamescope+0x3898a)
    #5 main ../src/main.cpp:114 (gamescope+0x387e0)

SUMMARY: ThreadSanitizer: unlock of an unlocked mutex (or by a wrong thread) /usr/include/c++/10.1.0/x86_64-pc-linux-gnu/bits/gthr-default.h:779 in __gthread_mutex_unlock
==================
==================
WARNING: ThreadSanitizer: data race (pid=121151)
  Write of size 1 at 0x7b6800070034 by main thread (mutexes: write M2051):
    #0 memcpy /build/gcc/src/gcc/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:806 (libtsan.so.0+0x41fdd)
    #1 memcpy /build/gcc/src/gcc/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:798 (libtsan.so.0+0x41fdd)
    #2 <null> <null> (libSDL2-2.0.so.0+0x6f461)
    #3 main ../src/main.cpp:114 (gamescope+0x387e0)

  Previous write of size 8 at 0x7b6800070030 by thread T17:
    [failed to restore the stack]

  Location is heap block of size 1384 at 0x7b680006fc00 allocated by thread T17:
    #0 calloc /build/gcc/src/gcc/libsanitizer/tsan/tsan_interceptors_posix.cpp:668 (libtsan.so.0+0x2ffbc)
    #1 <null> <null> (libSDL2-2.0.so.0+0x6ecc1)
    #2 void std::__invoke_impl<void, void (*)()>(std::__invoke_other, void (*&&)()) /usr/include/c++/10.1.0/bits/invoke.h:60 (gamescope+0x38408)
    #3 std::__invoke_result<void (*)()>::type std::__invoke<void (*)()>(void (*&&)()) /usr/include/c++/10.1.0/bits/invoke.h:95 (gamescope+0x3835f)
    #4 void std::thread::_Invoker<std::tuple<void (*)()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) /usr/include/c++/10.1.0/thread:264 (gamescope+0x382c4)
    #5 std::thread::_Invoker<std::tuple<void (*)()> >::operator()() /usr/include/c++/10.1.0/thread:271 (gamescope+0x3826e)
    #6 std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (*)()> > >::_M_run() /usr/include/c++/10.1.0/thread:215 (gamescope+0x380ae)
    #7 execute_native_thread_routine /build/gcc/src/gcc/libstdc++-v3/src/c++11/thread.cc:80 (libstdc++.so.6+0xcfb73)

  Mutex M2051 (0x561af0c0b420) created at:
    #0 pthread_mutex_lock /build/gcc/src/gcc/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:4148 (libtsan.so.0+0x528ce)
    #1 __gthread_mutex_lock /usr/include/c++/10.1.0/x86_64-pc-linux-gnu/bits/gthr-default.h:749 (gamescope+0x26e7f)
    #2 std::mutex::lock() /usr/include/c++/10.1.0/bits/std_mutex.h:100 (gamescope+0x2702e)
    #3 inputsdl_init ../src/inputsdl.cpp:440 (gamescope+0x46e74)
    #4 initOutput ../src/main.cpp:140 (gamescope+0x3898a)
    #5 main ../src/main.cpp:114 (gamescope+0x387e0)

  Thread T17 (tid=121171, running) created by main thread at:
    #0 pthread_create /build/gcc/src/gcc/libsanitizer/tsan/tsan_interceptors_posix.cpp:962 (libtsan.so.0+0x5efab)
    #1 __gthread_create /build/gcc/src/gcc-build/x86_64-pc-linux-gnu/libstdc++-v3/include/x86_64-pc-linux-gnu/bits/gthr-default.h:663 (libstdc++.so.6+0xcfe49)
    #2 std::thread::_M_start_thread(std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State> >, void (*)()) /build/gcc/src/gcc/libstdc++-v3/src/c++11/thread.cc:135 (libstdc++.so.6+0xcfe49)
    #3 inputsdl_init ../src/inputsdl.cpp:442 (gamescope+0x46e87)
    #4 initOutput ../src/main.cpp:140 (gamescope+0x3898a)
    #5 main ../src/main.cpp:114 (gamescope+0x387e0)

SUMMARY: ThreadSanitizer: data race (/usr/lib/libSDL2-2.0.so.0+0x6f461) 
==================
==================
WARNING: ThreadSanitizer: data race (pid=121151)
  Atomic read of size 1 at 0x7b0c00024510 by main thread (mutexes: write M2051):
    #0 pthread_mutex_lock /build/gcc/src/gcc/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:4148 (libtsan.so.0+0x528ce)
    #1 <null> <null> (libX11.so.6+0x2e803)
    #2 main ../src/main.cpp:114 (gamescope+0x387e0)

  Previous write of size 8 at 0x7b0c00024510 by thread T17:
    [failed to restore the stack]

  Location is heap block of size 40 at 0x7b0c00024510 allocated by thread T17:
    #0 malloc /build/gcc/src/gcc/libsanitizer/tsan/tsan_interceptors_posix.cpp:651 (libtsan.so.0+0x2fd25)
    #1 <null> <null> (libX11.so.6+0x2e522)
    #2 void std::__invoke_impl<void, void (*)()>(std::__invoke_other, void (*&&)()) /usr/include/c++/10.1.0/bits/invoke.h:60 (gamescope+0x38408)
    #3 std::__invoke_result<void (*)()>::type std::__invoke<void (*)()>(void (*&&)()) /usr/include/c++/10.1.0/bits/invoke.h:95 (gamescope+0x3835f)
    #4 void std::thread::_Invoker<std::tuple<void (*)()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) /usr/include/c++/10.1.0/thread:264 (gamescope+0x382c4)
    #5 std::thread::_Invoker<std::tuple<void (*)()> >::operator()() /usr/include/c++/10.1.0/thread:271 (gamescope+0x3826e)
    #6 std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (*)()> > >::_M_run() /usr/include/c++/10.1.0/thread:215 (gamescope+0x380ae)
    #7 execute_native_thread_routine /build/gcc/src/gcc/libstdc++-v3/src/c++11/thread.cc:80 (libstdc++.so.6+0xcfb73)

  Mutex M2051 (0x561af0c0b420) created at:
    #0 pthread_mutex_lock /build/gcc/src/gcc/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:4148 (libtsan.so.0+0x528ce)
    #1 __gthread_mutex_lock /usr/include/c++/10.1.0/x86_64-pc-linux-gnu/bits/gthr-default.h:749 (gamescope+0x26e7f)
    #2 std::mutex::lock() /usr/include/c++/10.1.0/bits/std_mutex.h:100 (gamescope+0x2702e)
    #3 inputsdl_init ../src/inputsdl.cpp:440 (gamescope+0x46e74)
    #4 initOutput ../src/main.cpp:140 (gamescope+0x3898a)
    #5 main ../src/main.cpp:114 (gamescope+0x387e0)

  Thread T17 (tid=121171, running) created by main thread at:
    #0 pthread_create /build/gcc/src/gcc/libsanitizer/tsan/tsan_interceptors_posix.cpp:962 (libtsan.so.0+0x5efab)
    #1 __gthread_create /build/gcc/src/gcc-build/x86_64-pc-linux-gnu/libstdc++-v3/include/x86_64-pc-linux-gnu/bits/gthr-default.h:663 (libstdc++.so.6+0xcfe49)
    #2 std::thread::_M_start_thread(std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State> >, void (*)()) /build/gcc/src/gcc/libstdc++-v3/src/c++11/thread.cc:135 (libstdc++.so.6+0xcfe49)
    #3 inputsdl_init ../src/inputsdl.cpp:442 (gamescope+0x46e87)
    #4 initOutput ../src/main.cpp:140 (gamescope+0x3898a)
    #5 main ../src/main.cpp:114 (gamescope+0x387e0)

SUMMARY: ThreadSanitizer: data race (/usr/lib/libX11.so.6+0x2e803) 
==================
==================
WARNING: ThreadSanitizer: data race (pid=121151)
  Read of size 8 at 0x561af0c0b0f0 by thread T17:
    #0 updateOutputRefresh() ../src/inputsdl.cpp:340 (gamescope+0x46904)
    #1 inputSDLThreadRun() ../src/inputsdl.cpp:421 (gamescope+0x46d9d)
    #2 void std::__invoke_impl<void, void (*)()>(std::__invoke_other, void (*&&)()) /usr/include/c++/10.1.0/bits/invoke.h:60 (gamescope+0x38408)
    #3 std::__invoke_result<void (*)()>::type std::__invoke<void (*)()>(void (*&&)()) /usr/include/c++/10.1.0/bits/invoke.h:95 (gamescope+0x3835f)
    #4 void std::thread::_Invoker<std::tuple<void (*)()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) /usr/include/c++/10.1.0/thread:264 (gamescope+0x382c4)
    #5 std::thread::_Invoker<std::tuple<void (*)()> >::operator()() /usr/include/c++/10.1.0/thread:271 (gamescope+0x3826e)
    #6 std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (*)()> > >::_M_run() /usr/include/c++/10.1.0/thread:215 (gamescope+0x380ae)
    #7 execute_native_thread_routine /build/gcc/src/gcc/libstdc++-v3/src/c++11/thread.cc:80 (libstdc++.so.6+0xcfb73)

  Previous write of size 8 at 0x561af0c0b0f0 by main thread (mutexes: write M2051):
    #0 initOutput ../src/main.cpp:149 (gamescope+0x38a08)
    #1 main ../src/main.cpp:114 (gamescope+0x387e0)

  As if synchronized via sleep:
    #0 nanosleep /build/gcc/src/gcc/libsanitizer/tsan/tsan_interceptors_posix.cpp:362 (libtsan.so.0+0x639a2)
    #1 <null> <null> (libSDL2-2.0.so.0+0x10018b)
    #2 void std::__invoke_impl<void, void (*)()>(std::__invoke_other, void (*&&)()) /usr/include/c++/10.1.0/bits/invoke.h:60 (gamescope+0x38408)
    #3 std::__invoke_result<void (*)()>::type std::__invoke<void (*)()>(void (*&&)()) /usr/include/c++/10.1.0/bits/invoke.h:95 (gamescope+0x3835f)
    #4 void std::thread::_Invoker<std::tuple<void (*)()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) /usr/include/c++/10.1.0/thread:264 (gamescope+0x382c4)
    #5 std::thread::_Invoker<std::tuple<void (*)()> >::operator()() /usr/include/c++/10.1.0/thread:271 (gamescope+0x3826e)
    #6 std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (*)()> > >::_M_run() /usr/include/c++/10.1.0/thread:215 (gamescope+0x380ae)
    #7 execute_native_thread_routine /build/gcc/src/gcc/libstdc++-v3/src/c++11/thread.cc:80 (libstdc++.so.6+0xcfb73)

  Location is global 'window' of size 8 at 0x561af0c0b0f0 (gamescope+0x00000010e0f0)

  Mutex M2051 (0x561af0c0b420) created at:
    #0 pthread_mutex_lock /build/gcc/src/gcc/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:4148 (libtsan.so.0+0x528ce)
    #1 __gthread_mutex_lock /usr/include/c++/10.1.0/x86_64-pc-linux-gnu/bits/gthr-default.h:749 (gamescope+0x26e7f)
    #2 std::mutex::lock() /usr/include/c++/10.1.0/bits/std_mutex.h:100 (gamescope+0x2702e)
    #3 inputsdl_init ../src/inputsdl.cpp:440 (gamescope+0x46e74)
    #4 initOutput ../src/main.cpp:140 (gamescope+0x3898a)
    #5 main ../src/main.cpp:114 (gamescope+0x387e0)

  Thread T17 (tid=121171, running) created by main thread at:
    #0 pthread_create /build/gcc/src/gcc/libsanitizer/tsan/tsan_interceptors_posix.cpp:962 (libtsan.so.0+0x5efab)
    #1 __gthread_create /build/gcc/src/gcc-build/x86_64-pc-linux-gnu/libstdc++-v3/include/x86_64-pc-linux-gnu/bits/gthr-default.h:663 (libstdc++.so.6+0xcfe49)
    #2 std::thread::_M_start_thread(std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State> >, void (*)()) /build/gcc/src/gcc/libstdc++-v3/src/c++11/thread.cc:135 (libstdc++.so.6+0xcfe49)
    #3 inputsdl_init ../src/inputsdl.cpp:442 (gamescope+0x46e87)
    #4 initOutput ../src/main.cpp:140 (gamescope+0x3898a)
    #5 main ../src/main.cpp:114 (gamescope+0x387e0)

SUMMARY: ThreadSanitizer: data race ../src/inputsdl.cpp:340 in updateOutputRefresh()
==================
==================
WARNING: ThreadSanitizer: data race (pid=121151)
  Read of size 4 at 0x561af0c08970 by thread T34:
    #0 gpuvis_trace_init ../src/gpuvis_trace_utils.h:390 (gamescope+0x195f8)
    #1 trace_printf_impl ../src/gpuvis_trace_utils.h:485 (gamescope+0x19c96)
    #2 gpuvis_trace_vprintf ../src/gpuvis_trace_utils.h:530 (gamescope+0x19f51)
    #3 gpuvis_trace_printf ../src/gpuvis_trace_utils.h:522 (gamescope+0x19eda)
    #4 steamcompmgr_main ../src/steamcompmgr.cpp:2537 (gamescope+0x2603e)
    #5 steamCompMgrThreadRun() ../src/main.cpp:125 (gamescope+0x3888c)
    #6 void std::__invoke_impl<void, void (*)()>(std::__invoke_other, void (*&&)()) /usr/include/c++/10.1.0/bits/invoke.h:60 (gamescope+0x38408)
    #7 std::__invoke_result<void (*)()>::type std::__invoke<void (*)()>(void (*&&)()) /usr/include/c++/10.1.0/bits/invoke.h:95 (gamescope+0x3835f)
    #8 void std::thread::_Invoker<std::tuple<void (*)()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) /usr/include/c++/10.1.0/thread:264 (gamescope+0x382c4)
    #9 std::thread::_Invoker<std::tuple<void (*)()> >::operator()() /usr/include/c++/10.1.0/thread:271 (gamescope+0x3826e)
    #10 std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (*)()> > >::_M_run() /usr/include/c++/10.1.0/thread:215 (gamescope+0x380ae)
    #11 execute_native_thread_routine /build/gcc/src/gcc/libstdc++-v3/src/c++11/thread.cc:80 (libstdc++.so.6+0xcfb73)

  Previous write of size 4 at 0x561af0c08970 by thread T40:
    #0 gpuvis_trace_init ../src/gpuvis_trace_utils.h:398 (gamescope+0x19667)
    #1 trace_printf_impl ../src/gpuvis_trace_utils.h:485 (gamescope+0x19c96)
    #2 gpuvis_trace_vprintf ../src/gpuvis_trace_utils.h:530 (gamescope+0x19f51)
    #3 gpuvis_trace_printf ../src/gpuvis_trace_utils.h:522 (gamescope+0x19eda)
    #4 vblankThreadRun() ../src/vblankmanager.cpp:53 (gamescope+0x471b5)
    #5 void std::__invoke_impl<void, void (*)()>(std::__invoke_other, void (*&&)()) /usr/include/c++/10.1.0/bits/invoke.h:60 (gamescope+0x38408)
    #6 std::__invoke_result<void (*)()>::type std::__invoke<void (*)()>(void (*&&)()) /usr/include/c++/10.1.0/bits/invoke.h:95 (gamescope+0x3835f)
    #7 void std::thread::_Invoker<std::tuple<void (*)()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) /usr/include/c++/10.1.0/thread:264 (gamescope+0x382c4)
    #8 std::thread::_Invoker<std::tuple<void (*)()> >::operator()() /usr/include/c++/10.1.0/thread:271 (gamescope+0x3826e)
    #9 std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (*)()> > >::_M_run() /usr/include/c++/10.1.0/thread:215 (gamescope+0x380ae)
    #10 execute_native_thread_routine /build/gcc/src/gcc/libstdc++-v3/src/c++11/thread.cc:80 (libstdc++.so.6+0xcfb73)

  Location is global 'g_trace_fd' of size 4 at 0x561af0c08970 (gamescope+0x00000010b970)

  Thread T34 (tid=121236, running) created by main thread at:
    #0 pthread_create /build/gcc/src/gcc/libsanitizer/tsan/tsan_interceptors_posix.cpp:962 (libtsan.so.0+0x5efab)
    #1 __gthread_create /build/gcc/src/gcc-build/x86_64-pc-linux-gnu/libstdc++-v3/include/x86_64-pc-linux-gnu/bits/gthr-default.h:663 (libstdc++.so.6+0xcfe49)
    #2 std::thread::_M_start_thread(std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State> >, void (*)()) /build/gcc/src/gcc/libstdc++-v3/src/c++11/thread.cc:135 (libstdc++.so.6+0xcfe49)
    #3 startSteamCompMgr ../src/main.cpp:130 (gamescope+0x388e3)
    #4 xwayland_ready ../src/wlserver.c:105 (gamescope+0x3b614)
    #5 wlr_signal_emit_safe ../subprojects/wlroots/util/signal.c:29 (gamescope+0xa8096)
    #6 xserver_handle_ready ../subprojects/wlroots/xwayland/xwayland.c:250 (gamescope+0xa912d)
    #7 <null> <null> (libwayland-server.so.0+0xa434)
    #8 main ../src/main.cpp:120 (gamescope+0x38821)

  Thread T40 (tid=121243, running) created by thread T34 at:
    #0 pthread_create /build/gcc/src/gcc/libsanitizer/tsan/tsan_interceptors_posix.cpp:962 (libtsan.so.0+0x5efab)
    #1 __gthread_create /build/gcc/src/gcc-build/x86_64-pc-linux-gnu/libstdc++-v3/include/x86_64-pc-linux-gnu/bits/gthr-default.h:663 (libstdc++.so.6+0xcfe49)
    #2 std::thread::_M_start_thread(std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State> >, void (*)()) /build/gcc/src/gcc/libstdc++-v3/src/c++11/thread.cc:135 (libstdc++.so.6+0xcfe49)
    #3 vblank_init() ../src/vblankmanager.cpp:73 (gamescope+0x473aa)
    #4 steamcompmgr_main ../src/steamcompmgr.cpp:2205 (gamescope+0x244b1)
    #5 steamCompMgrThreadRun() ../src/main.cpp:125 (gamescope+0x3888c)
    #6 void std::__invoke_impl<void, void (*)()>(std::__invoke_other, void (*&&)()) /usr/include/c++/10.1.0/bits/invoke.h:60 (gamescope+0x38408)
    #7 std::__invoke_result<void (*)()>::type std::__invoke<void (*)()>(void (*&&)()) /usr/include/c++/10.1.0/bits/invoke.h:95 (gamescope+0x3835f)
    #8 void std::thread::_Invoker<std::tuple<void (*)()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) /usr/include/c++/10.1.0/thread:264 (gamescope+0x382c4)
    #9 std::thread::_Invoker<std::tuple<void (*)()> >::operator()() /usr/include/c++/10.1.0/thread:271 (gamescope+0x3826e)
    #10 std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (*)()> > >::_M_run() /usr/include/c++/10.1.0/thread:215 (gamescope+0x380ae)
    #11 execute_native_thread_routine /build/gcc/src/gcc/libstdc++-v3/src/c++11/thread.cc:80 (libstdc++.so.6+0xcfb73)

SUMMARY: ThreadSanitizer: data race ../src/gpuvis_trace_utils.h:390 in gpuvis_trace_init
==================
==================
WARNING: ThreadSanitizer: data race (pid=121151)
  Write of size 4 at 0x561af0c089e4 by thread T17:
    #0 updateOutputRefresh() ../src/inputsdl.cpp:343 (gamescope+0x4694f)
    #1 inputSDLThreadRun() ../src/inputsdl.cpp:421 (gamescope+0x46d9d)
    #2 void std::__invoke_impl<void, void (*)()>(std::__invoke_other, void (*&&)()) /usr/include/c++/10.1.0/bits/invoke.h:60 (gamescope+0x38408)
    #3 std::__invoke_result<void (*)()>::type std::__invoke<void (*)()>(void (*&&)()) /usr/include/c++/10.1.0/bits/invoke.h:95 (gamescope+0x3835f)
    #4 void std::thread::_Invoker<std::tuple<void (*)()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) /usr/include/c++/10.1.0/thread:264 (gamescope+0x382c4)
    #5 std::thread::_Invoker<std::tuple<void (*)()> >::operator()() /usr/include/c++/10.1.0/thread:271 (gamescope+0x3826e)
    #6 std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (*)()> > >::_M_run() /usr/include/c++/10.1.0/thread:215 (gamescope+0x380ae)
    #7 execute_native_thread_routine /build/gcc/src/gcc/libstdc++-v3/src/c++11/thread.cc:80 (libstdc++.so.6+0xcfb73)

  Previous read of size 4 at 0x561af0c089e4 by thread T40:
    #0 vblankThreadRun() ../src/vblankmanager.cpp:31 (gamescope+0x46f67)
    #1 void std::__invoke_impl<void, void (*)()>(std::__invoke_other, void (*&&)()) /usr/include/c++/10.1.0/bits/invoke.h:60 (gamescope+0x38408)
    #2 std::__invoke_result<void (*)()>::type std::__invoke<void (*)()>(void (*&&)()) /usr/include/c++/10.1.0/bits/invoke.h:95 (gamescope+0x3835f)
    #3 void std::thread::_Invoker<std::tuple<void (*)()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) /usr/include/c++/10.1.0/thread:264 (gamescope+0x382c4)
    #4 std::thread::_Invoker<std::tuple<void (*)()> >::operator()() /usr/include/c++/10.1.0/thread:271 (gamescope+0x3826e)
    #5 std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (*)()> > >::_M_run() /usr/include/c++/10.1.0/thread:215 (gamescope+0x380ae)
    #6 execute_native_thread_routine /build/gcc/src/gcc/libstdc++-v3/src/c++11/thread.cc:80 (libstdc++.so.6+0xcfb73)

  Location is global 'g_nOutputRefresh' of size 4 at 0x561af0c089e4 (gamescope+0x00000010b9e4)

  Thread T17 (tid=121171, running) created by main thread at:
    #0 pthread_create /build/gcc/src/gcc/libsanitizer/tsan/tsan_interceptors_posix.cpp:962 (libtsan.so.0+0x5efab)
    #1 __gthread_create /build/gcc/src/gcc-build/x86_64-pc-linux-gnu/libstdc++-v3/include/x86_64-pc-linux-gnu/bits/gthr-default.h:663 (libstdc++.so.6+0xcfe49)
    #2 std::thread::_M_start_thread(std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State> >, void (*)()) /build/gcc/src/gcc/libstdc++-v3/src/c++11/thread.cc:135 (libstdc++.so.6+0xcfe49)
    #3 inputsdl_init ../src/inputsdl.cpp:442 (gamescope+0x46e87)
    #4 initOutput ../src/main.cpp:140 (gamescope+0x3898a)
    #5 main ../src/main.cpp:114 (gamescope+0x387e0)

  Thread T40 (tid=121243, running) created by thread T34 at:
    #0 pthread_create /build/gcc/src/gcc/libsanitizer/tsan/tsan_interceptors_posix.cpp:962 (libtsan.so.0+0x5efab)
    #1 __gthread_create /build/gcc/src/gcc-build/x86_64-pc-linux-gnu/libstdc++-v3/include/x86_64-pc-linux-gnu/bits/gthr-default.h:663 (libstdc++.so.6+0xcfe49)
    #2 std::thread::_M_start_thread(std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State> >, void (*)()) /build/gcc/src/gcc/libstdc++-v3/src/c++11/thread.cc:135 (libstdc++.so.6+0xcfe49)
    #3 vblank_init() ../src/vblankmanager.cpp:73 (gamescope+0x473aa)
    #4 steamcompmgr_main ../src/steamcompmgr.cpp:2205 (gamescope+0x244b1)
    #5 steamCompMgrThreadRun() ../src/main.cpp:125 (gamescope+0x3888c)
    #6 void std::__invoke_impl<void, void (*)()>(std::__invoke_other, void (*&&)()) /usr/include/c++/10.1.0/bits/invoke.h:60 (gamescope+0x38408)
    #7 std::__invoke_result<void (*)()>::type std::__invoke<void (*)()>(void (*&&)()) /usr/include/c++/10.1.0/bits/invoke.h:95 (gamescope+0x3835f)
    #8 void std::thread::_Invoker<std::tuple<void (*)()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) /usr/include/c++/10.1.0/thread:264 (gamescope+0x382c4)
    #9 std::thread::_Invoker<std::tuple<void (*)()> >::operator()() /usr/include/c++/10.1.0/thread:271 (gamescope+0x3826e)
    #10 std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (*)()> > >::_M_run() /usr/include/c++/10.1.0/thread:215 (gamescope+0x380ae)
    #11 execute_native_thread_routine /build/gcc/src/gcc/libstdc++-v3/src/c++11/thread.cc:80 (libstdc++.so.6+0xcfb73)

SUMMARY: ThreadSanitizer: data race ../src/inputsdl.cpp:343 in updateOutputRefresh()
==================
==================
WARNING: ThreadSanitizer: data race (pid=121151)
  Read of size 4 at 0x561af0c089dc by thread T34:
    #0 steamcompmgr_main ../src/steamcompmgr.cpp:2582 (gamescope+0x262b6)
    #1 steamCompMgrThreadRun() ../src/main.cpp:125 (gamescope+0x3888c)
    #2 void std::__invoke_impl<void, void (*)()>(std::__invoke_other, void (*&&)()) /usr/include/c++/10.1.0/bits/invoke.h:60 (gamescope+0x38408)
    #3 std::__invoke_result<void (*)()>::type std::__invoke<void (*)()>(void (*&&)()) /usr/include/c++/10.1.0/bits/invoke.h:95 (gamescope+0x3835f)
    #4 void std::thread::_Invoker<std::tuple<void (*)()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) /usr/include/c++/10.1.0/thread:264 (gamescope+0x382c4)
    #5 std::thread::_Invoker<std::tuple<void (*)()> >::operator()() /usr/include/c++/10.1.0/thread:271 (gamescope+0x3826e)
    #6 std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (*)()> > >::_M_run() /usr/include/c++/10.1.0/thread:215 (gamescope+0x380ae)
    #7 execute_native_thread_routine /build/gcc/src/gcc/libstdc++-v3/src/c++11/thread.cc:80 (libstdc++.so.6+0xcfb73)

  Previous write of size 4 at 0x561af0c089dc by thread T17:
    #0 inputSDLThreadRun() ../src/inputsdl.cpp:424 (gamescope+0x46dc6)
    #1 void std::__invoke_impl<void, void (*)()>(std::__invoke_other, void (*&&)()) /usr/include/c++/10.1.0/bits/invoke.h:60 (gamescope+0x38408)
    #2 std::__invoke_result<void (*)()>::type std::__invoke<void (*)()>(void (*&&)()) /usr/include/c++/10.1.0/bits/invoke.h:95 (gamescope+0x3835f)
    #3 void std::thread::_Invoker<std::tuple<void (*)()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) /usr/include/c++/10.1.0/thread:264 (gamescope+0x382c4)
    #4 std::thread::_Invoker<std::tuple<void (*)()> >::operator()() /usr/include/c++/10.1.0/thread:271 (gamescope+0x3826e)
    #5 std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (*)()> > >::_M_run() /usr/include/c++/10.1.0/thread:215 (gamescope+0x380ae)
    #6 execute_native_thread_routine /build/gcc/src/gcc/libstdc++-v3/src/c++11/thread.cc:80 (libstdc++.so.6+0xcfb73)

  Location is global 'g_nOutputWidth' of size 4 at 0x561af0c089dc (gamescope+0x00000010b9dc)

  Thread T34 (tid=121236, running) created by main thread at:
    #0 pthread_create /build/gcc/src/gcc/libsanitizer/tsan/tsan_interceptors_posix.cpp:962 (libtsan.so.0+0x5efab)
    #1 __gthread_create /build/gcc/src/gcc-build/x86_64-pc-linux-gnu/libstdc++-v3/include/x86_64-pc-linux-gnu/bits/gthr-default.h:663 (libstdc++.so.6+0xcfe49)
    #2 std::thread::_M_start_thread(std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State> >, void (*)()) /build/gcc/src/gcc/libstdc++-v3/src/c++11/thread.cc:135 (libstdc++.so.6+0xcfe49)
    #3 startSteamCompMgr ../src/main.cpp:130 (gamescope+0x388e3)
    #4 xwayland_ready ../src/wlserver.c:105 (gamescope+0x3b614)
    #5 wlr_signal_emit_safe ../subprojects/wlroots/util/signal.c:29 (gamescope+0xa8096)
    #6 xserver_handle_ready ../subprojects/wlroots/xwayland/xwayland.c:250 (gamescope+0xa912d)
    #7 <null> <null> (libwayland-server.so.0+0xa434)
    #8 main ../src/main.cpp:120 (gamescope+0x38821)

  Thread T17 (tid=121171, running) created by main thread at:
    #0 pthread_create /build/gcc/src/gcc/libsanitizer/tsan/tsan_interceptors_posix.cpp:962 (libtsan.so.0+0x5efab)
    #1 __gthread_create /build/gcc/src/gcc-build/x86_64-pc-linux-gnu/libstdc++-v3/include/x86_64-pc-linux-gnu/bits/gthr-default.h:663 (libstdc++.so.6+0xcfe49)
    #2 std::thread::_M_start_thread(std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State> >, void (*)()) /build/gcc/src/gcc/libstdc++-v3/src/c++11/thread.cc:135 (libstdc++.so.6+0xcfe49)
    #3 inputsdl_init ../src/inputsdl.cpp:442 (gamescope+0x46e87)
    #4 initOutput ../src/main.cpp:140 (gamescope+0x3898a)
    #5 main ../src/main.cpp:114 (gamescope+0x387e0)

SUMMARY: ThreadSanitizer: data race ../src/steamcompmgr.cpp:2582 in steamcompmgr_main
==================

Plus a bunch of other races when cleaning up, but we're segfaulting anyway on shutdown.

@emersion emersion added the bug Something isn't working label May 19, 2020
@emersion emersion changed the title ThreadSanitizer race conditions ThreadSanitizer race conditions in nested mode May 19, 2020
@emersion emersion added the nested Nested mode via X11/Wayland label Sep 4, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working nested Nested mode via X11/Wayland
Projects
None yet
Development

No branches or pull requests

1 participant