mgerhardy / simpleai

SimpleAI is a small C++ AI behaviour tree based library with a QT5 based remote debugger (and with optional LUA bindings) released under MIT.

Home Page:http://www.caveproductions.org/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

TSAN warning - data race - ai::Zone::update

mgerhardy opened this issue · comments

WARNING: ThreadSanitizer: data race (pid=10882)
  Read of size 8 at 0x7d180000bf58 by thread T5 (mutexes: write M244):
    #0 std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter>::get() const /usr/include/c++/5/bits/unique_ptr.h:305 (simpleai-run+0x00000054497d)
    #1 std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter>::operator*() const /usr/include/c++/5/bits/unique_ptr.h:291 (simpleai-run+0x00000053a5c3)
    #2 std::__future_base::_State_baseV2::wait() /usr/include/c++/5/future:323 (simpleai-run+0x000000531885)
    #3 std::__basic_future<void>::wait() const /usr/include/c++/5/future:656 (simpleai-run+0x00000054bd9f)
    #4 executeParallel<ai::Zone::update(int64_t)::<lambda(const AIPtr&)> > /home/mgerhardy/dev/simpleai/src/ai/zone/Zone.h:222 (simpleai-run+0x0000006335f4)
    #5 ai::Zone::update(long) /home/mgerhardy/dev/simpleai/src/ai/zone/Zone.cpp:83 (simpleai-run+0x0000006331bf)
    #6 ai::example::GameMap::update(long) <null> (simpleai-run+0x000000539281)
    #7 operator() /home/mgerhardy/dev/simpleai/src/run/Main.cpp:295 (simpleai-run+0x000000523fc3)
    #8 __call<void> /usr/include/c++/5/functional:1074 (simpleai-run+0x000000529152)
    #9 operator()<, void> /usr/include/c++/5/functional:1133 (simpleai-run+0x00000052830f)
    #10 _M_invoke /usr/include/c++/5/functional:1871 (simpleai-run+0x0000005276a2)
    #11 std::function<void ()>::operator()() const <null> (simpleai-run+0x00000053e675)
    #12 ai::ThreadScheduler::ScheduledTask::operator()() const <null> (simpleai-run+0x000000534090)
    #13 ai::ThreadScheduler::ThreadScheduler()::{lambda()#1}::operator()() const <null> (simpleai-run+0x000000534942)
    #14 void std::_Bind_simple<ai::ThreadScheduler::ThreadScheduler()::{lambda()#1} ()>::_M_invoke<>(std::_Index_tuple<>) <null> (simpleai-run+0x00000056d8ae)
    #15 std::_Bind_simple<ai::ThreadScheduler::ThreadScheduler()::{lambda()#1} ()>::operator()() <null> (simpleai-run+0x00000056d14c)
    #16 std::thread::_Impl<std::_Bind_simple<ai::ThreadScheduler::ThreadScheduler()::{lambda()#1} ()> >::_M_run() <null> (simpleai-run+0x00000056ce8c)
    #17 <null> <null> (libstdc++.so.6+0x0000000b941f)

  Previous write of size 8 at 0x7d180000bf58 by thread T1:
    #0 void std::swap<std::__future_base::_Result_base*>(std::__future_base::_Result_base*&, std::__future_base::_Result_base*&) /usr/include/c++/5/bits/move.h:186 (simpleai-run+0x00000055d763)
    #1 std::_Tuple_impl<0ul, std::__future_base::_Result_base*, std::__future_base::_Result_base::_Deleter>::_M_swap(std::_Tuple_impl<0ul, std::__future_base::_Result_base*, std::__future_base::_Result_base::_Deleter>&) /usr/include/c++/5/tuple:332 (simpleai-run+0x000000556ccf)
    #2 std::tuple<std::__future_base::_Result_base*, std::__future_base::_Result_base::_Deleter>::swap(std::tuple<std::__future_base::_Result_base*, std::__future_base::_Result_base::_Deleter>&) /usr/include/c++/5/tuple:742 (simpleai-run+0x00000054ddad)
    #3 void std::swap<std::__future_base::_Result_base*, std::__future_base::_Result_base::_Deleter>(std::tuple<std::__future_base::_Result_base*, std::__future_base::_Result_base::_Deleter>&, std::tuple<std::__future_base::_Result_base*, std::__future_base::_Result_base::_Deleter>&) /usr/include/c++/5/tuple:1134 (simpleai-run+0x000000545504)
    #4 std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter>::swap(std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter>&) /usr/include/c++/5/bits/unique_ptr.h:352 (simpleai-run+0x00000053becf)
    #5 std::__future_base::_State_baseV2::_M_do_set(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*) /usr/include/c++/5/future:532 (simpleai-run+0x00000053258d)
    #6 void std::_Mem_fn_base<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), true>::operator()<std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*, void>(std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) const /usr/include/c++/5/functional:600 (simpleai-run+0x00000055d5ec)
    #7 void std::_Bind_simple<std::_Mem_fn<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*)> (std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*)>::_M_invoke<0ul, 1ul, 2ul>(std::_Index_tuple<0ul, 1ul, 2ul>) /usr/include/c++/5/functional:1531 (simpleai-run+0x000000556bee)
    #8 std::_Bind_simple<std::_Mem_fn<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*)> (std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*)>::operator()() /usr/include/c++/5/functional:1520 (simpleai-run+0x00000054dd2c)
    #9 void std::__once_call_impl<std::_Bind_simple<std::_Mem_fn<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*)> (std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*)> >() /usr/include/c++/5/mutex:706 (simpleai-run+0x000000544bc0)
    #10 pthread_once <null> (libtsan.so.0+0x00000002962f)
    #11 __gthread_once /usr/include/x86_64-linux-gnu/c++/5/bits/gthr-default.h:699 (simpleai-run+0x00000051fee9)
    #12 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) /usr/include/c++/5/mutex:738 (simpleai-run+0x00000053b017)
    #13 std::__future_base::_State_baseV2::_M_set_result(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>, bool) /usr/include/c++/5/future:387 (simpleai-run+0x000000531a64)
    #14 _M_run /usr/include/c++/5/future:1403 (simpleai-run+0x00000063885b)
    #15 std::packaged_task<void ()>::operator()() /usr/include/c++/5/future:1547 (simpleai-run+0x00000055b8f7)
    #16 operator() /home/mgerhardy/dev/simpleai/src/ai/./common/ThreadPool.h:98 (simpleai-run+0x000000633845)
    #17 _M_invoke /usr/include/c++/5/functional:1871 (simpleai-run+0x00000063561d)
    #18 std::function<void ()>::operator()() const <null> (simpleai-run+0x00000053e675)
    #19 ai::ThreadPool::ThreadPool(unsigned long)::{lambda()#1}::operator()() const <null> (simpleai-run+0x0000005331e2)
    #20 void std::_Bind_simple<ai::ThreadPool::ThreadPool(unsigned long)::{lambda()#1} ()>::_M_invoke<>(std::_Index_tuple<>) <null> (simpleai-run+0x00000056d716)
    #21 std::_Bind_simple<ai::ThreadPool::ThreadPool(unsigned long)::{lambda()#1} ()>::operator()() <null> (simpleai-run+0x00000056d0f0)
    #22 std::thread::_Impl<std::_Bind_simple<ai::ThreadPool::ThreadPool(unsigned long)::{lambda()#1} ()> >::_M_run() <null> (simpleai-run+0x00000056c1ce)
    #23 <null> <null> (libstdc++.so.6+0x0000000b941f)

  Location is heap block of size 88 at 0x7d180000bf40 allocated by thread T5:
    #0 operator new(unsigned long) <null> (libtsan.so.0+0x0000000659b3)
    #1 allocate /usr/include/c++/5/ext/new_allocator.h:104 (simpleai-run+0x00000063762e)
    #2 allocate /usr/include/c++/5/bits/alloc_traits.h:491 (simpleai-run+0x000000637297)
    #3 __allocate_guarded<std::allocator<std::_Sp_counted_ptr_inplace<std::__future_base::_Task_state<std::_Bind<ai::Zone::update(int64_t)::<lambda(const AIPtr&)>(std::shared_ptr<ai::AI>)>, std::allocator<int>, void()>, std::allocator<int>, (__gnu_cxx::_Lock_policy)2u> > > /usr/include/c++/5/bits/allocated_ptr.h:102 (simpleai-run+0x000000636ce4)
    #4 __shared_count<std::__future_base::_Task_state<std::_Bind<ai::Zone::update(int64_t)::<lambda(const AIPtr&)>(std::shared_ptr<ai::AI>)>, std::allocator<int>, void()>, std::allocator<int>, std::_Bind<ai::Zone::update(int64_t)::<lambda(const AIPtr&)>(std::shared_ptr<ai::AI>)>, const std::allocator<int>&> /usr/include/c++/5/bits/shared_ptr_base.h:615 (simpleai-run+0x000000636a50)
    #5 __shared_ptr<std::allocator<int>, std::_Bind<ai::Zone::update(int64_t)::<lambda(const AIPtr&)>(std::shared_ptr<ai::AI>)>, const std::allocator<int>&> /usr/include/c++/5/bits/shared_ptr_base.h:1097 (simpleai-run+0x000000636879)
    #6 shared_ptr<std::allocator<int>, std::_Bind<ai::Zone::update(int64_t)::<lambda(const AIPtr&)>(std::shared_ptr<ai::AI>)>, const std::allocator<int>&> /usr/include/c++/5/bits/shared_ptr.h:319 (simpleai-run+0x0000006365d4)
    #7 allocate_shared<std::__future_base::_Task_state<std::_Bind<ai::Zone::update(int64_t)::<lambda(const AIPtr&)>(std::shared_ptr<ai::AI>)>, std::allocator<int>, void()>, std::allocator<int>, std::_Bind<ai::Zone::update(int64_t)::<lambda(const AIPtr&)>(std::shared_ptr<ai::AI>)>, const std::allocator<int>&> /usr/include/c++/5/bits/shared_ptr.h:620 (simpleai-run+0x00000063634c)
    #8 __create_task_state<void(), std::_Bind<ai::Zone::update(int64_t)::<lambda(const AIPtr&)>(std::shared_ptr<ai::AI>)>, std::allocator<int> > /usr/include/c++/5/future:1445 (simpleai-run+0x000000636217)
    #9 packaged_task<std::_Bind<ai::Zone::update(int64_t)::<lambda(const AIPtr&)>(std::shared_ptr<ai::AI>)>, std::allocator<int>, void> /usr/include/c++/5/future:1497 (simpleai-run+0x000000636062)
    #10 packaged_task<std::_Bind<ai::Zone::update(int64_t)::<lambda(const AIPtr&)>(std::shared_ptr<ai::AI>)>, void> /usr/include/c++/5/future:1487 (simpleai-run+0x000000635f81)
    #11 construct<std::packaged_task<void()>, std::_Bind<ai::Zone::update(int64_t)::<lambda(const AIPtr&)>(std::shared_ptr<ai::AI>)> > /usr/include/c++/5/ext/new_allocator.h:120 (simpleai-run+0x000000635e26)
    #12 construct<std::packaged_task<void()>, std::_Bind<ai::Zone::update(int64_t)::<lambda(const AIPtr&)>(std::shared_ptr<ai::AI>)> > /usr/include/c++/5/bits/alloc_traits.h:530 (simpleai-run+0x0000006358c9)
    #13 _Sp_counted_ptr_inplace<std::_Bind<ai::Zone::update(int64_t)::<lambda(const AIPtr&)>(std::shared_ptr<ai::AI>)> > /usr/include/c++/5/bits/shared_ptr_base.h:522 (simpleai-run+0x0000006354d2)
    #14 __shared_count<std::packaged_task<void()>, std::allocator<std::packaged_task<void()> >, std::_Bind<ai::Zone::update(int64_t)::<lambda(const AIPtr&)>(std::shared_ptr<ai::AI>)> > /usr/include/c++/5/bits/shared_ptr_base.h:617 (simpleai-run+0x000000635025)
    #15 __shared_ptr<std::allocator<std::packaged_task<void()> >, std::_Bind<ai::Zone::update(int64_t)::<lambda(const AIPtr&)>(std::shared_ptr<ai::AI>)> > /usr/include/c++/5/bits/shared_ptr_base.h:1097 (simpleai-run+0x000000634bd7)
    #16 shared_ptr<std::allocator<std::packaged_task<void()> >, std::_Bind<ai::Zone::update(int64_t)::<lambda(const AIPtr&)>(std::shared_ptr<ai::AI>)> > /usr/include/c++/5/bits/shared_ptr.h:319 (simpleai-run+0x000000634770)
    #17 allocate_shared<std::packaged_task<void()>, std::allocator<std::packaged_task<void()> >, std::_Bind<ai::Zone::update(int64_t)::<lambda(const AIPtr&)>(std::shared_ptr<ai::AI>)> > /usr/include/c++/5/bits/shared_ptr.h:620 (simpleai-run+0x000000634424)
    #18 make_shared<std::packaged_task<void()>, std::_Bind<ai::Zone::update(int64_t)::<lambda(const AIPtr&)>(std::shared_ptr<ai::AI>)> > /usr/include/c++/5/bits/shared_ptr.h:636 (simpleai-run+0x000000633da7)
    #19 enqueue<const ai::Zone::update(int64_t)::<lambda(const AIPtr&)>&, const std::shared_ptr<ai::AI>&> /home/mgerhardy/dev/simpleai/src/ai/./common/ThreadPool.h:93 (simpleai-run+0x0000006339d9)
    #20 executeAsync<ai::Zone::update(int64_t)::<lambda(const AIPtr&)> > /home/mgerhardy/dev/simpleai/src/ai/zone/Zone.h:167 (simpleai-run+0x0000006336d5)
    #21 executeParallel<ai::Zone::update(int64_t)::<lambda(const AIPtr&)> > /home/mgerhardy/dev/simpleai/src/ai/zone/Zone.h:218 (simpleai-run+0x0000006334a8)
    #22 ai::Zone::update(long) /home/mgerhardy/dev/simpleai/src/ai/zone/Zone.cpp:83 (simpleai-run+0x0000006331bf)
    #23 ai::example::GameMap::update(long) <null> (simpleai-run+0x000000539281)
    #24 operator() /home/mgerhardy/dev/simpleai/src/run/Main.cpp:295 (simpleai-run+0x000000523fc3)
    #25 __call<void> /usr/include/c++/5/functional:1074 (simpleai-run+0x000000529152)
    #26 operator()<, void> /usr/include/c++/5/functional:1133 (simpleai-run+0x00000052830f)
    #27 _M_invoke /usr/include/c++/5/functional:1871 (simpleai-run+0x0000005276a2)
    #28 std::function<void ()>::operator()() const <null> (simpleai-run+0x00000053e675)
    #29 ai::ThreadScheduler::ScheduledTask::operator()() const <null> (simpleai-run+0x000000534090)
    #30 ai::ThreadScheduler::ThreadScheduler()::{lambda()#1}::operator()() const <null> (simpleai-run+0x000000534942)
    #31 void std::_Bind_simple<ai::ThreadScheduler::ThreadScheduler()::{lambda()#1} ()>::_M_invoke<>(std::_Index_tuple<>) <null> (simpleai-run+0x00000056d8ae)
    #32 std::_Bind_simple<ai::ThreadScheduler::ThreadScheduler()::{lambda()#1} ()>::operator()() <null> (simpleai-run+0x00000056d14c)
    #33 std::thread::_Impl<std::_Bind_simple<ai::ThreadScheduler::ThreadScheduler()::{lambda()#1} ()> >::_M_run() <null> (simpleai-run+0x00000056ce8c)
    #34 <null> <null> (libstdc++.so.6+0x0000000b941f)

  Mutex M244 (0x7ffc9758abc8) created at:
    #0 pthread_mutex_lock <null> (libtsan.so.0+0x0000000363de)
    #1 __gthread_mutex_lock /usr/include/x86_64-linux-gnu/c++/5/bits/gthr-default.h:748 (simpleai-run+0x00000051ff44)
    #2 std::mutex::lock() /usr/include/c++/5/mutex:135 (simpleai-run+0x00000053068b)
    #3 std::unique_lock<std::mutex>::lock() /usr/include/c++/5/mutex:485 (simpleai-run+0x000000546863)
    #4 std::unique_lock<std::mutex>::unique_lock(std::mutex&) /usr/include/c++/5/mutex:415 (simpleai-run+0x00000053e1d6)
    #5 scheduleAtFixedRate<main(int, char**)::<lambda()> > /home/mgerhardy/dev/simpleai/src/ai/common/ThreadScheduler.h:103 (simpleai-run+0x000000525f61)
    #6 main /home/mgerhardy/dev/simpleai/src/run/Main.cpp:295 (simpleai-run+0x0000005253de)

  Thread T5 (tid=10888, running) created by main thread at:
    #0 pthread_create <null> (libtsan.so.0+0x000000027d7d)
    #1 std::thread::_M_start_thread(std::shared_ptr<std::thread::_Impl_base>, void (*)()) <null> (libstdc++.so.6+0x0000000b9562)
    #2 ai::ThreadScheduler::ThreadScheduler() <null> (simpleai-run+0x000000534e22)
    #3 main /home/mgerhardy/dev/simpleai/src/run/Main.cpp:292 (simpleai-run+0x00000052517a)

  Thread T1 (tid=10884, running) created by main thread at:
    #0 pthread_create <null> (libtsan.so.0+0x000000027d7d)
    #1 std::thread::_M_start_thread(std::shared_ptr<std::thread::_Impl_base>, void (*)()) <null> (libstdc++.so.6+0x0000000b9562)
    #2 _ZN9__gnu_cxx13new_allocatorISt6threadE9constructIS1_IZN2ai10ThreadPoolC4EmEUlvE_EEEvPT_DpOT0_ <null> (simpleai-run+0x00000054fcec)
    #3 _ZNSt16allocator_traitsISaISt6threadEE9constructIS0_IZN2ai10ThreadPoolC4EmEUlvE_EEEvRS1_PT_DpOT0_ <null> (simpleai-run+0x000000546f88)
    #4 void std::vector<std::thread, std::allocator<std::thread> >::emplace_back<ai::ThreadPool::ThreadPool(unsigned long)::{lambda()#1}>(ai::ThreadPool::ThreadPool(unsigned long)::{lambda()#1}&&) <null> (simpleai-run+0x00000053e86a)
    #5 ai::ThreadPool::ThreadPool(unsigned long) <null> (simpleai-run+0x00000053360e)
    #6 ai::Zone::Zone(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int) <null> (simpleai-run+0x00000053700b)
    #7 ai::example::GameMap::GameMap(int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ai::Server&) /home/mgerhardy/dev/simpleai/src/run/GameMap.h:23 (simpleai-run+0x000000537a09)
    #8 createMap /home/mgerhardy/dev/simpleai/src/run/Main.cpp:69 (simpleai-run+0x00000052074e)
    #9 main /home/mgerhardy/dev/simpleai/src/run/Main.cpp:288 (simpleai-run+0x0000005250d2)

This happend for ./simpleai-run -file src/run/behaviours.lua

data races should be fixed for now.