Skip to content
This repository has been archived by the owner on Aug 8, 2023. It is now read-only.

ThreadSanitizer error on API.RepeatedRender test #9620

Closed
tmpsantos opened this issue Jul 26, 2017 · 3 comments
Closed

ThreadSanitizer error on API.RepeatedRender test #9620

tmpsantos opened this issue Jul 26, 2017 · 3 comments

Comments

@tmpsantos
Copy link
Contributor

https://circleci.com/gh/mapbox/mapbox-gl-native/14419

[ RUN      ] API.RepeatedRender
==================
WARNING: ThreadSanitizer: data race (pid=1428)
  Write of size 8 at 0x7b18000f1818 by thread T8:
    #0 void std::swap<mbgl::util::AsyncTask*>(mbgl::util::AsyncTask*&, mbgl::util::AsyncTask*&) /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/move.h:186:11 (mbgl-test+0x874f00)
    #1 std::unique_ptr<mbgl::util::AsyncTask, std::default_delete<mbgl::util::AsyncTask> >::reset(mbgl::util::AsyncTask*) /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/unique_ptr.h:342:2 (mbgl-test+0x87407b)
    #2 mbgl::util::RunLoop::~RunLoop() /src/build/linux-x86_64/Sanitize/../../../platform/default/run_loop.cpp:120:17 (mbgl-test+0xe40f4c)
    #3 mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::Thread<std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&)::{lambda()#1}::operator()() const /src/build/linux-x86_64/Sanitize/../../../src/mbgl/util/thread.hpp:58:9 (mbgl-test+0xd2b757)
    #4 void std::_Bind_simple<mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::Thread<std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&)::{lambda()#1} ()>::_M_invoke<>(std::_Index_tuple<>) /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/functional:1530:18 (mbgl-test+0xd2b5e9)
    #5 std::_Bind_simple<mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::Thread<std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&)::{lambda()#1} ()>::operator()() /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/functional:1520:16 (mbgl-test+0xd2b599)
    #6 std::thread::_Impl<std::_Bind_simple<mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::Thread<std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&)::{lambda()#1} ()> >::_M_run() /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/thread:115:13 (mbgl-test+0xd2b44d)
    #7 <null> <null> (libstdc++.so.6+0xb8c7f)

  Previous read of size 8 at 0x7b18000f1818 by main thread:
    #0 std::unique_ptr<mbgl::util::AsyncTask, std::default_delete<mbgl::util::AsyncTask> >::get() const /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/unique_ptr.h:305:16 (mbgl-test+0x874dd4)
    #1 std::unique_ptr<mbgl::util::AsyncTask, std::default_delete<mbgl::util::AsyncTask> >::operator->() const /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/unique_ptr.h:299:9 (mbgl-test+0x874029)
    #2 mbgl::util::RunLoop::push(std::shared_ptr<mbgl::WorkTask>) /src/build/linux-x86_64/Sanitize/../../../platform/default/run_loop.cpp:135:5 (mbgl-test+0xe411a9)
    #3 void mbgl::util::RunLoop::invoke<mbgl::util::RunLoop::stop()::$_1>(mbgl::util::RunLoop::stop()::$_1&&) /src/build/linux-x86_64/Sanitize/../../../include/mbgl/util/run_loop.hpp:54:9 (mbgl-test+0xe41398)
    #4 mbgl::util::RunLoop::stop() /src/build/linux-x86_64/Sanitize/../../../platform/default/run_loop.cpp:152:5 (mbgl-test+0xe41331)
    #5 mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::~Thread() /src/build/linux-x86_64/Sanitize/../../../src/mbgl/util/thread.hpp:82:15 (mbgl-test+0xd2a568)
    #6 mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::~Thread() /src/build/linux-x86_64/Sanitize/../../../src/mbgl/util/thread.hpp:63:24 (mbgl-test+0xd2a679)
    #7 std::default_delete<mbgl::util::Thread<mbgl::DefaultFileSource::Impl> >::operator()(mbgl::util::Thread<mbgl::DefaultFileSource::Impl>*) const /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/unique_ptr.h:76:2 (mbgl-test+0xd2fd87)
    #8 std::unique_ptr<mbgl::util::Thread<mbgl::DefaultFileSource::Impl>, std::default_delete<mbgl::util::Thread<mbgl::DefaultFileSource::Impl> > >::~unique_ptr() /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/unique_ptr.h:236:4 (mbgl-test+0xd20ac9)
    #9 mbgl::DefaultFileSource::~DefaultFileSource() /src/build/linux-x86_64/Sanitize/../../../platform/default/default_file_source.cpp:201:39 (mbgl-test+0xd1f3a9)
    #10 API_RepeatedRender_Test::TestBody() /src/build/linux-x86_64/Sanitize/../../../test/api/repeated_render.test.cpp:80:1 (mbgl-test+0x58b0c8)
    #11 testing::Test::Run() <null> (mbgl-test+0xe1de80)
    #12 mbgl::runTests(int, char**) /src/build/linux-x86_64/Sanitize/../../../test/src/mbgl/test/test.cpp:14:12 (mbgl-test+0x62b373)
    #13 main /src/build/linux-x86_64/Sanitize/../../../platform/default/mbgl/test/main.cpp:19:12 (mbgl-test+0x8feccc)

  Location is heap block of size 88 at 0x7b18000f1800 allocated by thread T8:
    #0 operator new(unsigned long) <null> (mbgl-test+0x4efa33)
    #1 std::_MakeUniq<mbgl::util::RunLoop::Impl>::__single_object std::make_unique<mbgl::util::RunLoop::Impl>() /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/unique_ptr.h:765:30 (mbgl-test+0xe4328c)
    #2 mbgl::util::RunLoop::RunLoop(mbgl::util::RunLoop::Type) /src/build/linux-x86_64/Sanitize/../../../platform/default/run_loop.cpp:80:36 (mbgl-test+0xe40c7c)
    #3 mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::Thread<std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&)::{lambda()#1}::operator()() const /src/build/linux-x86_64/Sanitize/../../../src/mbgl/util/thread.hpp:50:27 (mbgl-test+0xd2b695)
    #4 void std::_Bind_simple<mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::Thread<std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&)::{lambda()#1} ()>::_M_invoke<>(std::_Index_tuple<>) /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/functional:1530:18 (mbgl-test+0xd2b5e9)
    #5 std::_Bind_simple<mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::Thread<std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&)::{lambda()#1} ()>::operator()() /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/functional:1520:16 (mbgl-test+0xd2b599)
    #6 std::thread::_Impl<std::_Bind_simple<mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::Thread<std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&)::{lambda()#1} ()> >::_M_run() /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/thread:115:13 (mbgl-test+0xd2b44d)
    #7 <null> <null> (libstdc++.so.6+0xb8c7f)

  Thread T8 'DefaultFileSour' (tid=2183, running) created by main thread at:
    #0 pthread_create <null> (mbgl-test+0x460b6b)
    #1 std::thread::_M_start_thread(std::shared_ptr<std::thread::_Impl_base>, void (*)()) <null> (libstdc++.so.6+0xb8dc2)
    #2 mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::Thread<std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&) /src/build/linux-x86_64/Sanitize/../../../src/mbgl/util/thread.hpp:46:18 (mbgl-test+0xd2a1f6)
    #3 std::_MakeUniq<mbgl::util::Thread<mbgl::DefaultFileSource::Impl> >::__single_object std::make_unique<mbgl::util::Thread<mbgl::DefaultFileSource::Impl>, char const (&) [18], std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&>(char const (&) [18], std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&) /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/unique_ptr.h:765:34 (mbgl-test+0xd20a11)
    #4 mbgl::DefaultFileSource::DefaultFileSource(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::unique_ptr<mbgl::FileSource, std::default_delete<mbgl::FileSource> >&&, unsigned long) /src/build/linux-x86_64/Sanitize/../../../platform/default/default_file_source.cpp:198:16 (mbgl-test+0xd1f2b8)
    #5 mbgl::DefaultFileSource::DefaultFileSource(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long) /src/build/linux-x86_64/Sanitize/../../../platform/default/default_file_source.cpp:191:7 (mbgl-test+0xd1f1e0)
    #6 API_RepeatedRender_Test::TestBody() /src/build/linux-x86_64/Sanitize/../../../test/api/repeated_render.test.cpp:34:23 (mbgl-test+0x58acdb)
    #7 testing::Test::Run() <null> (mbgl-test+0xe1de80)
    #8 mbgl::runTests(int, char**) /src/build/linux-x86_64/Sanitize/../../../test/src/mbgl/test/test.cpp:14:12 (mbgl-test+0x62b373)
    #9 main /src/build/linux-x86_64/Sanitize/../../../platform/default/mbgl/test/main.cpp:19:12 (mbgl-test+0x8feccc)

SUMMARY: ThreadSanitizer: data race /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/move.h:186:11 in void std::swap<mbgl::util::AsyncTask*>(mbgl::util::AsyncTask*&, mbgl::util::AsyncTask*&)
==================
==================
WARNING: ThreadSanitizer: data race (pid=1428)
  Write of size 8 at 0x7b0c0002c160 by thread T8:
    #0 operator delete(void*) <null> (mbgl-test+0x4efcd1)
    #1 std::default_delete<mbgl::util::AsyncTask::Impl>::operator()(mbgl::util::AsyncTask::Impl*) const /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/unique_ptr.h:76:2 (mbgl-test+0xe40836)
    #2 std::unique_ptr<mbgl::util::AsyncTask::Impl, std::default_delete<mbgl::util::AsyncTask::Impl> >::~unique_ptr() /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/unique_ptr.h:236:4 (mbgl-test+0xe402c9)
    #3 mbgl::util::AsyncTask::~AsyncTask() /src/build/linux-x86_64/Sanitize/../../../platform/default/async_task.cpp:59:23 (mbgl-test+0xe40199)
    #4 std::default_delete<mbgl::util::AsyncTask>::operator()(mbgl::util::AsyncTask*) const /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/unique_ptr.h:76:2 (mbgl-test+0x874c3e)
    #5 std::unique_ptr<mbgl::util::AsyncTask, std::default_delete<mbgl::util::AsyncTask> >::reset(mbgl::util::AsyncTask*) /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/unique_ptr.h:344:4 (mbgl-test+0x8740aa)
    #6 mbgl::util::RunLoop::~RunLoop() /src/build/linux-x86_64/Sanitize/../../../platform/default/run_loop.cpp:120:17 (mbgl-test+0xe40f4c)
    #7 mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::Thread<std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&)::{lambda()#1}::operator()() const /src/build/linux-x86_64/Sanitize/../../../src/mbgl/util/thread.hpp:58:9 (mbgl-test+0xd2b757)
    #8 void std::_Bind_simple<mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::Thread<std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&)::{lambda()#1} ()>::_M_invoke<>(std::_Index_tuple<>) /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/functional:1530:18 (mbgl-test+0xd2b5e9)
    #9 std::_Bind_simple<mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::Thread<std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&)::{lambda()#1} ()>::operator()() /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/functional:1520:16 (mbgl-test+0xd2b599)
    #10 std::thread::_Impl<std::_Bind_simple<mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::Thread<std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&)::{lambda()#1} ()> >::_M_run() /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/thread:115:13 (mbgl-test+0xd2b44d)
    #11 <null> <null> (libstdc++.so.6+0xb8c7f)

  Previous read of size 8 at 0x7b0c0002c160 by main thread:
    #0 mbgl::util::AsyncTask::Impl::maySend() /src/build/linux-x86_64/Sanitize/../../../platform/default/async_task.cpp:36:27 (mbgl-test+0xe4033a)
    #1 mbgl::util::AsyncTask::send() /src/build/linux-x86_64/Sanitize/../../../platform/default/async_task.cpp:62:11 (mbgl-test+0xe401d1)
    #2 mbgl::util::RunLoop::push(std::shared_ptr<mbgl::WorkTask>) /src/build/linux-x86_64/Sanitize/../../../platform/default/run_loop.cpp:135:18 (mbgl-test+0xe411b1)
    #3 void mbgl::util::RunLoop::invoke<mbgl::util::RunLoop::stop()::$_1>(mbgl::util::RunLoop::stop()::$_1&&) /src/build/linux-x86_64/Sanitize/../../../include/mbgl/util/run_loop.hpp:54:9 (mbgl-test+0xe41398)
    #4 mbgl::util::RunLoop::stop() /src/build/linux-x86_64/Sanitize/../../../platform/default/run_loop.cpp:152:5 (mbgl-test+0xe41331)
    #5 mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::~Thread() /src/build/linux-x86_64/Sanitize/../../../src/mbgl/util/thread.hpp:82:15 (mbgl-test+0xd2a568)
    #6 mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::~Thread() /src/build/linux-x86_64/Sanitize/../../../src/mbgl/util/thread.hpp:63:24 (mbgl-test+0xd2a679)
    #7 std::default_delete<mbgl::util::Thread<mbgl::DefaultFileSource::Impl> >::operator()(mbgl::util::Thread<mbgl::DefaultFileSource::Impl>*) const /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/unique_ptr.h:76:2 (mbgl-test+0xd2fd87)
    #8 std::unique_ptr<mbgl::util::Thread<mbgl::DefaultFileSource::Impl>, std::default_delete<mbgl::util::Thread<mbgl::DefaultFileSource::Impl> > >::~unique_ptr() /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/unique_ptr.h:236:4 (mbgl-test+0xd20ac9)
    #9 mbgl::DefaultFileSource::~DefaultFileSource() /src/build/linux-x86_64/Sanitize/../../../platform/default/default_file_source.cpp:201:39 (mbgl-test+0xd1f3a9)
    #10 API_RepeatedRender_Test::TestBody() /src/build/linux-x86_64/Sanitize/../../../test/api/repeated_render.test.cpp:80:1 (mbgl-test+0x58b0c8)
    #11 testing::Test::Run() <null> (mbgl-test+0xe1de80)
    #12 mbgl::runTests(int, char**) /src/build/linux-x86_64/Sanitize/../../../test/src/mbgl/test/test.cpp:14:12 (mbgl-test+0x62b373)
    #13 main /src/build/linux-x86_64/Sanitize/../../../platform/default/mbgl/test/main.cpp:19:12 (mbgl-test+0x8feccc)

  Thread T8 'DefaultFileSour' (tid=2183, running) created by main thread at:
    #0 pthread_create <null> (mbgl-test+0x460b6b)
    #1 std::thread::_M_start_thread(std::shared_ptr<std::thread::_Impl_base>, void (*)()) <null> (libstdc++.so.6+0xb8dc2)
    #2 mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::Thread<std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&) /src/build/linux-x86_64/Sanitize/../../../src/mbgl/util/thread.hpp:46:18 (mbgl-test+0xd2a1f6)
    #3 std::_MakeUniq<mbgl::util::Thread<mbgl::DefaultFileSource::Impl> >::__single_object std::make_unique<mbgl::util::Thread<mbgl::DefaultFileSource::Impl>, char const (&) [18], std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&>(char const (&) [18], std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&) /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/unique_ptr.h:765:34 (mbgl-test+0xd20a11)
    #4 mbgl::DefaultFileSource::DefaultFileSource(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::unique_ptr<mbgl::FileSource, std::default_delete<mbgl::FileSource> >&&, unsigned long) /src/build/linux-x86_64/Sanitize/../../../platform/default/default_file_source.cpp:198:16 (mbgl-test+0xd1f2b8)
    #5 mbgl::DefaultFileSource::DefaultFileSource(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long) /src/build/linux-x86_64/Sanitize/../../../platform/default/default_file_source.cpp:191:7 (mbgl-test+0xd1f1e0)
    #6 API_RepeatedRender_Test::TestBody() /src/build/linux-x86_64/Sanitize/../../../test/api/repeated_render.test.cpp:34:23 (mbgl-test+0x58acdb)
    #7 testing::Test::Run() <null> (mbgl-test+0xe1de80)
    #8 mbgl::runTests(int, char**) /src/build/linux-x86_64/Sanitize/../../../test/src/mbgl/test/test.cpp:14:12 (mbgl-test+0x62b373)
    #9 main /src/build/linux-x86_64/Sanitize/../../../platform/default/mbgl/test/main.cpp:19:12 (mbgl-test+0x8feccc)

SUMMARY: ThreadSanitizer: data race (/src/build/linux-x86_64/Sanitize/mbgl-test+0x4efcd1) in operator delete(void*)
==================
==================
WARNING: ThreadSanitizer: data race (pid=1428)
  Write of size 8 at 0x7b0400008b90 by thread T8:
    #0 std::unique_ptr<mbgl::util::AsyncTask::Impl, std::default_delete<mbgl::util::AsyncTask::Impl> >::~unique_ptr() /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/unique_ptr.h:237:8 (mbgl-test+0xe402d1)
    #1 mbgl::util::AsyncTask::~AsyncTask() /src/build/linux-x86_64/Sanitize/../../../platform/default/async_task.cpp:59:23 (mbgl-test+0xe40199)
    #2 std::default_delete<mbgl::util::AsyncTask>::operator()(mbgl::util::AsyncTask*) const /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/unique_ptr.h:76:2 (mbgl-test+0x874c3e)
    #3 std::unique_ptr<mbgl::util::AsyncTask, std::default_delete<mbgl::util::AsyncTask> >::reset(mbgl::util::AsyncTask*) /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/unique_ptr.h:344:4 (mbgl-test+0x8740aa)
    #4 mbgl::util::RunLoop::~RunLoop() /src/build/linux-x86_64/Sanitize/../../../platform/default/run_loop.cpp:120:17 (mbgl-test+0xe40f4c)
    #5 mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::Thread<std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&)::{lambda()#1}::operator()() const /src/build/linux-x86_64/Sanitize/../../../src/mbgl/util/thread.hpp:58:9 (mbgl-test+0xd2b757)
    #6 void std::_Bind_simple<mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::Thread<std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&)::{lambda()#1} ()>::_M_invoke<>(std::_Index_tuple<>) /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/functional:1530:18 (mbgl-test+0xd2b5e9)
    #7 std::_Bind_simple<mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::Thread<std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&)::{lambda()#1} ()>::operator()() /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/functional:1520:16 (mbgl-test+0xd2b599)
    #8 std::thread::_Impl<std::_Bind_simple<mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::Thread<std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&)::{lambda()#1} ()> >::_M_run() /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/thread:115:13 (mbgl-test+0xd2b44d)
    #9 <null> <null> (libstdc++.so.6+0xb8c7f)

  Previous read of size 8 at 0x7b0400008b90 by main thread:
    #0 std::unique_ptr<mbgl::util::AsyncTask::Impl, std::default_delete<mbgl::util::AsyncTask::Impl> >::get() const /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/unique_ptr.h:305:16 (mbgl-test+0xe40ab4)
    #1 std::unique_ptr<mbgl::util::AsyncTask::Impl, std::default_delete<mbgl::util::AsyncTask::Impl> >::operator->() const /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/unique_ptr.h:299:9 (mbgl-test+0xe40309)
    #2 mbgl::util::AsyncTask::send() /src/build/linux-x86_64/Sanitize/../../../platform/default/async_task.cpp:62:5 (mbgl-test+0xe401c9)
    #3 mbgl::util::RunLoop::push(std::shared_ptr<mbgl::WorkTask>) /src/build/linux-x86_64/Sanitize/../../../platform/default/run_loop.cpp:135:18 (mbgl-test+0xe411b1)
    #4 void mbgl::util::RunLoop::invoke<mbgl::util::RunLoop::stop()::$_1>(mbgl::util::RunLoop::stop()::$_1&&) /src/build/linux-x86_64/Sanitize/../../../include/mbgl/util/run_loop.hpp:54:9 (mbgl-test+0xe41398)
    #5 mbgl::util::RunLoop::stop() /src/build/linux-x86_64/Sanitize/../../../platform/default/run_loop.cpp:152:5 (mbgl-test+0xe41331)
    #6 mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::~Thread() /src/build/linux-x86_64/Sanitize/../../../src/mbgl/util/thread.hpp:82:15 (mbgl-test+0xd2a568)
    #7 mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::~Thread() /src/build/linux-x86_64/Sanitize/../../../src/mbgl/util/thread.hpp:63:24 (mbgl-test+0xd2a679)
    #8 std::default_delete<mbgl::util::Thread<mbgl::DefaultFileSource::Impl> >::operator()(mbgl::util::Thread<mbgl::DefaultFileSource::Impl>*) const /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/unique_ptr.h:76:2 (mbgl-test+0xd2fd87)
    #9 std::unique_ptr<mbgl::util::Thread<mbgl::DefaultFileSource::Impl>, std::default_delete<mbgl::util::Thread<mbgl::DefaultFileSource::Impl> > >::~unique_ptr() /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/unique_ptr.h:236:4 (mbgl-test+0xd20ac9)
    #10 mbgl::DefaultFileSource::~DefaultFileSource() /src/build/linux-x86_64/Sanitize/../../../platform/default/default_file_source.cpp:201:39 (mbgl-test+0xd1f3a9)
    #11 API_RepeatedRender_Test::TestBody() /src/build/linux-x86_64/Sanitize/../../../test/api/repeated_render.test.cpp:80:1 (mbgl-test+0x58b0c8)
    #12 testing::Test::Run() <null> (mbgl-test+0xe1de80)
    #13 mbgl::runTests(int, char**) /src/build/linux-x86_64/Sanitize/../../../test/src/mbgl/test/test.cpp:14:12 (mbgl-test+0x62b373)
    #14 main /src/build/linux-x86_64/Sanitize/../../../platform/default/mbgl/test/main.cpp:19:12 (mbgl-test+0x8feccc)

  Location is heap block of size 8 at 0x7b0400008b90 allocated by thread T8:
    #0 operator new(unsigned long) <null> (mbgl-test+0x4efa33)
    #1 std::_MakeUniq<mbgl::util::AsyncTask>::__single_object std::make_unique<mbgl::util::AsyncTask, std::_Bind<std::_Mem_fn<void (mbgl::util::RunLoop::*)()> (mbgl::util::RunLoop*)> >(std::_Bind<std::_Mem_fn<void (mbgl::util::RunLoop::*)()> (mbgl::util::RunLoop*)>&&) /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/unique_ptr.h:765:30 (mbgl-test+0xe43335)
    #2 mbgl::util::RunLoop::RunLoop(mbgl::util::RunLoop::Type) /src/build/linux-x86_64/Sanitize/../../../platform/default/run_loop.cpp:102:19 (mbgl-test+0xe40de4)
    #3 mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::Thread<std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&)::{lambda()#1}::operator()() const /src/build/linux-x86_64/Sanitize/../../../src/mbgl/util/thread.hpp:50:27 (mbgl-test+0xd2b695)
    #4 void std::_Bind_simple<mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::Thread<std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&)::{lambda()#1} ()>::_M_invoke<>(std::_Index_tuple<>) /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/functional:1530:18 (mbgl-test+0xd2b5e9)
    #5 std::_Bind_simple<mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::Thread<std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&)::{lambda()#1} ()>::operator()() /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/functional:1520:16 (mbgl-test+0xd2b599)
    #6 std::thread::_Impl<std::_Bind_simple<mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::Thread<std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&)::{lambda()#1} ()> >::_M_run() /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/thread:115:13 (mbgl-test+0xd2b44d)
    #7 <null> <null> (libstdc++.so.6+0xb8c7f)

  Thread T8 'DefaultFileSour' (tid=2183, running) created by main thread at:
    #0 pthread_create <null> (mbgl-test+0x460b6b)
    #1 std::thread::_M_start_thread(std::shared_ptr<std::thread::_Impl_base>, void (*)()) <null> (libstdc++.so.6+0xb8dc2)
    #2 mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::Thread<std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&) /src/build/linux-x86_64/Sanitize/../../../src/mbgl/util/thread.hpp:46:18 (mbgl-test+0xd2a1f6)
    #3 std::_MakeUniq<mbgl::util::Thread<mbgl::DefaultFileSource::Impl> >::__single_object std::make_unique<mbgl::util::Thread<mbgl::DefaultFileSource::Impl>, char const (&) [18], std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&>(char const (&) [18], std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&) /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/unique_ptr.h:765:34 (mbgl-test+0xd20a11)
    #4 mbgl::DefaultFileSource::DefaultFileSource(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::unique_ptr<mbgl::FileSource, std::default_delete<mbgl::FileSource> >&&, unsigned long) /src/build/linux-x86_64/Sanitize/../../../platform/default/default_file_source.cpp:198:16 (mbgl-test+0xd1f2b8)
    #5 mbgl::DefaultFileSource::DefaultFileSource(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long) /src/build/linux-x86_64/Sanitize/../../../platform/default/default_file_source.cpp:191:7 (mbgl-test+0xd1f1e0)
    #6 API_RepeatedRender_Test::TestBody() /src/build/linux-x86_64/Sanitize/../../../test/api/repeated_render.test.cpp:34:23 (mbgl-test+0x58acdb)
    #7 testing::Test::Run() <null> (mbgl-test+0xe1de80)
    #8 mbgl::runTests(int, char**) /src/build/linux-x86_64/Sanitize/../../../test/src/mbgl/test/test.cpp:14:12 (mbgl-test+0x62b373)
    #9 main /src/build/linux-x86_64/Sanitize/../../../platform/default/mbgl/test/main.cpp:19:12 (mbgl-test+0x8feccc)

SUMMARY: ThreadSanitizer: data race /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/unique_ptr.h:237:8 in std::unique_ptr<mbgl::util::AsyncTask::Impl, std::default_delete<mbgl::util::AsyncTask::Impl> >::~unique_ptr()
==================
==================
WARNING: ThreadSanitizer: data race (pid=1428)
  Write of size 8 at 0x7ba000000130 by thread T8:
    #0 close <null> (mbgl-test+0x464e06)
    #1 uv__close_nocheckstdio /home/travis/build/mapbox/mason/mason_packages/.build/libuv-1.9.1/src/unix/core.c:508 (mbgl-test+0xfdc5e7)
    #2 uv__close /home/travis/build/mapbox/mason/mason_packages/.build/libuv-1.9.1/src/unix/core.c:522 (mbgl-test+0xfdc5e7)
    #3 mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::Thread<std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&)::{lambda()#1}::operator()() const /src/build/linux-x86_64/Sanitize/../../../src/mbgl/util/thread.hpp:58:9 (mbgl-test+0xd2b757)
    #4 void std::_Bind_simple<mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::Thread<std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&)::{lambda()#1} ()>::_M_invoke<>(std::_Index_tuple<>) /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/functional:1530:18 (mbgl-test+0xd2b5e9)
    #5 std::_Bind_simple<mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::Thread<std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&)::{lambda()#1} ()>::operator()() /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/functional:1520:16 (mbgl-test+0xd2b599)
    #6 std::thread::_Impl<std::_Bind_simple<mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::Thread<std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&)::{lambda()#1} ()> >::_M_run() /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/thread:115:13 (mbgl-test+0xd2b44d)
    #7 <null> <null> (libstdc++.so.6+0xb8c7f)

  Previous read of size 8 at 0x7ba000000130 by main thread:
    #0 write <null> (mbgl-test+0x4687ac)
    #1 uv__async_send /home/travis/build/mapbox/mason/mason_packages/.build/libuv-1.9.1/src/unix/async.c:167 (mbgl-test+0xfdb884)
    #2 uv_async_send /home/travis/build/mapbox/mason/mason_packages/.build/libuv-1.9.1/src/unix/async.c:66 (mbgl-test+0xfdb884)
    #3 mbgl::util::AsyncTask::send() /src/build/linux-x86_64/Sanitize/../../../platform/default/async_task.cpp:62:11 (mbgl-test+0xe401d1)
    #4 mbgl::util::RunLoop::push(std::shared_ptr<mbgl::WorkTask>) /src/build/linux-x86_64/Sanitize/../../../platform/default/run_loop.cpp:135:18 (mbgl-test+0xe411b1)
    #5 void mbgl::util::RunLoop::invoke<mbgl::util::RunLoop::stop()::$_1>(mbgl::util::RunLoop::stop()::$_1&&) /src/build/linux-x86_64/Sanitize/../../../include/mbgl/util/run_loop.hpp:54:9 (mbgl-test+0xe41398)
    #6 mbgl::util::RunLoop::stop() /src/build/linux-x86_64/Sanitize/../../../platform/default/run_loop.cpp:152:5 (mbgl-test+0xe41331)
    #7 mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::~Thread() /src/build/linux-x86_64/Sanitize/../../../src/mbgl/util/thread.hpp:82:15 (mbgl-test+0xd2a568)
    #8 mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::~Thread() /src/build/linux-x86_64/Sanitize/../../../src/mbgl/util/thread.hpp:63:24 (mbgl-test+0xd2a679)
    #9 std::default_delete<mbgl::util::Thread<mbgl::DefaultFileSource::Impl> >::operator()(mbgl::util::Thread<mbgl::DefaultFileSource::Impl>*) const /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/unique_ptr.h:76:2 (mbgl-test+0xd2fd87)
    #10 std::unique_ptr<mbgl::util::Thread<mbgl::DefaultFileSource::Impl>, std::default_delete<mbgl::util::Thread<mbgl::DefaultFileSource::Impl> > >::~unique_ptr() /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/unique_ptr.h:236:4 (mbgl-test+0xd20ac9)
    #11 mbgl::DefaultFileSource::~DefaultFileSource() /src/build/linux-x86_64/Sanitize/../../../platform/default/default_file_source.cpp:201:39 (mbgl-test+0xd1f3a9)
    #12 API_RepeatedRender_Test::TestBody() /src/build/linux-x86_64/Sanitize/../../../test/api/repeated_render.test.cpp:80:1 (mbgl-test+0x58b0c8)
    #13 testing::Test::Run() <null> (mbgl-test+0xe1de80)
    #14 mbgl::runTests(int, char**) /src/build/linux-x86_64/Sanitize/../../../test/src/mbgl/test/test.cpp:14:12 (mbgl-test+0x62b373)
    #15 main /src/build/linux-x86_64/Sanitize/../../../platform/default/mbgl/test/main.cpp:19:12 (mbgl-test+0x8feccc)

  Location is file descriptor 19 created by main thread at:
    [failed to restore the stack]

  Thread T8 'DefaultFileSour' (tid=2183, running) created by main thread at:
    #0 pthread_create <null> (mbgl-test+0x460b6b)
    #1 std::thread::_M_start_thread(std::shared_ptr<std::thread::_Impl_base>, void (*)()) <null> (libstdc++.so.6+0xb8dc2)
    #2 mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::Thread<std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&) /src/build/linux-x86_64/Sanitize/../../../src/mbgl/util/thread.hpp:46:18 (mbgl-test+0xd2a1f6)
    #3 std::_MakeUniq<mbgl::util::Thread<mbgl::DefaultFileSource::Impl> >::__single_object std::make_unique<mbgl::util::Thread<mbgl::DefaultFileSource::Impl>, char const (&) [18], std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&>(char const (&) [18], std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&) /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/unique_ptr.h:765:34 (mbgl-test+0xd20a11)
    #4 mbgl::DefaultFileSource::DefaultFileSource(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::unique_ptr<mbgl::FileSource, std::default_delete<mbgl::FileSource> >&&, unsigned long) /src/build/linux-x86_64/Sanitize/../../../platform/default/default_file_source.cpp:198:16 (mbgl-test+0xd1f2b8)
    #5 mbgl::DefaultFileSource::DefaultFileSource(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long) /src/build/linux-x86_64/Sanitize/../../../platform/default/default_file_source.cpp:191:7 (mbgl-test+0xd1f1e0)
    #6 API_RepeatedRender_Test::TestBody() /src/build/linux-x86_64/Sanitize/../../../test/api/repeated_render.test.cpp:34:23 (mbgl-test+0x58acdb)
    #7 testing::Test::Run() <null> (mbgl-test+0xe1de80)
    #8 mbgl::runTests(int, char**) /src/build/linux-x86_64/Sanitize/../../../test/src/mbgl/test/test.cpp:14:12 (mbgl-test+0x62b373)
    #9 main /src/build/linux-x86_64/Sanitize/../../../platform/default/mbgl/test/main.cpp:19:12 (mbgl-test+0x8feccc)

SUMMARY: ThreadSanitizer: data race (/src/build/linux-x86_64/Sanitize/mbgl-test+0x464e06) in __interceptor_close
==================
==================
WARNING: ThreadSanitizer: data race (pid=1428)
  Write of size 8 at 0x7fe95cd74a48 by thread T8:
    #0 std::unique_ptr<mbgl::util::RunLoop::Impl, std::default_delete<mbgl::util::RunLoop::Impl> >::~unique_ptr() /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/unique_ptr.h:237:8 (mbgl-test+0xe435d1)
    #1 mbgl::util::RunLoop::~RunLoop() /src/build/linux-x86_64/Sanitize/../../../platform/default/run_loop.cpp:127:1 (mbgl-test+0xe40f9c)
    #2 mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::Thread<std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&)::{lambda()#1}::operator()() const /src/build/linux-x86_64/Sanitize/../../../src/mbgl/util/thread.hpp:58:9 (mbgl-test+0xd2b757)
    #3 void std::_Bind_simple<mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::Thread<std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&)::{lambda()#1} ()>::_M_invoke<>(std::_Index_tuple<>) /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/functional:1530:18 (mbgl-test+0xd2b5e9)
    #4 std::_Bind_simple<mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::Thread<std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&)::{lambda()#1} ()>::operator()() /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/functional:1520:16 (mbgl-test+0xd2b599)
    #5 std::thread::_Impl<std::_Bind_simple<mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::Thread<std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&)::{lambda()#1} ()> >::_M_run() /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/thread:115:13 (mbgl-test+0xd2b44d)
    #6 <null> <null> (libstdc++.so.6+0xb8c7f)

  Previous read of size 8 at 0x7fe95cd74a48 by main thread:
    #0 std::unique_ptr<mbgl::util::RunLoop::Impl, std::default_delete<mbgl::util::RunLoop::Impl> >::get() const /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/unique_ptr.h:305:16 (mbgl-test+0xe47984)
    #1 std::unique_ptr<mbgl::util::RunLoop::Impl, std::default_delete<mbgl::util::RunLoop::Impl> >::operator->() const /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/unique_ptr.h:299:9 (mbgl-test+0xe432f9)
    #2 mbgl::util::RunLoop::push(std::shared_ptr<mbgl::WorkTask>) /src/build/linux-x86_64/Sanitize/../../../platform/default/run_loop.cpp:135:5 (mbgl-test+0xe411a0)
    #3 void mbgl::util::RunLoop::invoke<mbgl::util::RunLoop::stop()::$_1>(mbgl::util::RunLoop::stop()::$_1&&) /src/build/linux-x86_64/Sanitize/../../../include/mbgl/util/run_loop.hpp:54:9 (mbgl-test+0xe41398)
    #4 mbgl::util::RunLoop::stop() /src/build/linux-x86_64/Sanitize/../../../platform/default/run_loop.cpp:152:5 (mbgl-test+0xe41331)
    #5 mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::~Thread() /src/build/linux-x86_64/Sanitize/../../../src/mbgl/util/thread.hpp:82:15 (mbgl-test+0xd2a568)
    #6 mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::~Thread() /src/build/linux-x86_64/Sanitize/../../../src/mbgl/util/thread.hpp:63:24 (mbgl-test+0xd2a679)
    #7 std::default_delete<mbgl::util::Thread<mbgl::DefaultFileSource::Impl> >::operator()(mbgl::util::Thread<mbgl::DefaultFileSource::Impl>*) const /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/unique_ptr.h:76:2 (mbgl-test+0xd2fd87)
    #8 std::unique_ptr<mbgl::util::Thread<mbgl::DefaultFileSource::Impl>, std::default_delete<mbgl::util::Thread<mbgl::DefaultFileSource::Impl> > >::~unique_ptr() /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/unique_ptr.h:236:4 (mbgl-test+0xd20ac9)
    #9 mbgl::DefaultFileSource::~DefaultFileSource() /src/build/linux-x86_64/Sanitize/../../../platform/default/default_file_source.cpp:201:39 (mbgl-test+0xd1f3a9)
    #10 API_RepeatedRender_Test::TestBody() /src/build/linux-x86_64/Sanitize/../../../test/api/repeated_render.test.cpp:80:1 (mbgl-test+0x58b0c8)
    #11 testing::Test::Run() <null> (mbgl-test+0xe1de80)
    #12 mbgl::runTests(int, char**) /src/build/linux-x86_64/Sanitize/../../../test/src/mbgl/test/test.cpp:14:12 (mbgl-test+0x62b373)
    #13 main /src/build/linux-x86_64/Sanitize/../../../platform/default/mbgl/test/main.cpp:19:12 (mbgl-test+0x8feccc)

  Location is stack of thread T8.

  Thread T8 'DefaultFileSour' (tid=2183, running) created by main thread at:
    #0 pthread_create <null> (mbgl-test+0x460b6b)
    #1 std::thread::_M_start_thread(std::shared_ptr<std::thread::_Impl_base>, void (*)()) <null> (libstdc++.so.6+0xb8dc2)
    #2 mbgl::util::Thread<mbgl::DefaultFileSource::Impl>::Thread<std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&) /src/build/linux-x86_64/Sanitize/../../../src/mbgl/util/thread.hpp:46:18 (mbgl-test+0xd2a1f6)
    #3 std::_MakeUniq<mbgl::util::Thread<mbgl::DefaultFileSource::Impl> >::__single_object std::make_unique<mbgl::util::Thread<mbgl::DefaultFileSource::Impl>, char const (&) [18], std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&>(char const (&) [18], std::shared_ptr<mbgl::FileSource> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long&) /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/unique_ptr.h:765:34 (mbgl-test+0xd20a11)
    #4 mbgl::DefaultFileSource::DefaultFileSource(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::unique_ptr<mbgl::FileSource, std::default_delete<mbgl::FileSource> >&&, unsigned long) /src/build/linux-x86_64/Sanitize/../../../platform/default/default_file_source.cpp:198:16 (mbgl-test+0xd1f2b8)
    #5 mbgl::DefaultFileSource::DefaultFileSource(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long) /src/build/linux-x86_64/Sanitize/../../../platform/default/default_file_source.cpp:191:7 (mbgl-test+0xd1f1e0)
    #6 API_RepeatedRender_Test::TestBody() /src/build/linux-x86_64/Sanitize/../../../test/api/repeated_render.test.cpp:34:23 (mbgl-test+0x58acdb)
    #7 testing::Test::Run() <null> (mbgl-test+0xe1de80)
    #8 mbgl::runTests(int, char**) /src/build/linux-x86_64/Sanitize/../../../test/src/mbgl/test/test.cpp:14:12 (mbgl-test+0x62b373)
    #9 main /src/build/linux-x86_64/Sanitize/../../../platform/default/mbgl/test/main.cpp:19:12 (mbgl-test+0x8feccc)

SUMMARY: ThreadSanitizer: data race /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/unique_ptr.h:237:8 in std::unique_ptr<mbgl::util::RunLoop::Impl, std::default_delete<mbgl::util::RunLoop::Impl> >::~unique_ptr()
==================
[       OK ] API.RepeatedRender (5985 ms)
@ChrisLoer
Copy link
Contributor

I think I know what's going on here:

  • Foreground finishes running test, calls Thread destructors
  • ~Thread calls loop->stop() which pushes a stop request to the background thread with RunLoop::push()
  • There are different implementations for different platforms, but both the libuv and the darwin implementation grab a mutex to put the stop request on the queue, then release the mutex. They then call impl->async->send(), but in this scenario let's assume the foreground gets interrupted before that happens.
  • The background run loop happens to run RunLoop::process(). Note that the latest call to async->send() hasn't happened yet, but we could be running process in response to a previous async call.
  • process() runs through the queue, and at the end it runs the platform-specific call that stops the run loop
  • Still in the background, the loop->run() call from the Thread constructor completes. The lambda exits, and calls the RunLoop destructor, which deletes impl->async
  • We switch back to the foreground, and call impl->async->send() -- 💥

/cc @jfirebaugh @kkaefer

ChrisLoer added a commit that referenced this issue Nov 22, 2017
Because a message we queue from the foreground may cause the background to complete, exit, and tear down the AsyncTask, we have to block queue processing until we've finished our call to AsyncTask::send().
Broadening the scope of a mutex is scary, but I audited the code of our four implementations of AsyncTask and I don't see any way this could cause a deadlock.
@jfirebaugh
Copy link
Contributor

Good analysis @ChrisLoer -- that looks right to me. It looks to me like this was a regression in #9265. The ~Thread implementation prior to that PR used the joinable promise to guarntee that loop->stop() completed before ~RunLoop, while the implementation afterward uses it for a different purpose. That suggests an alternative to #10537 as a fix. I'm not sure which is better.

ChrisLoer added a commit that referenced this issue Nov 27, 2017
Because a message we queue from the foreground may cause the background to complete, exit, and tear down the AsyncTask, we have to block queue processing until we've finished our call to AsyncTask::send().
Broadening the scope of a mutex is scary, but I audited the code of our four implementations of AsyncTask and I don't see any way this could cause a deadlock.
ChrisLoer added a commit that referenced this issue Nov 27, 2017
Because a message we queue from the foreground may cause the background to complete, exit, and tear down the AsyncTask, we have to block queue processing until we've finished our call to AsyncTask::send().
Broadening the scope of a mutex is scary, but I audited the code of our four implementations of AsyncTask and I don't see any way this could cause a deadlock.
@ChrisLoer
Copy link
Contributor

Fixed in #10537. I looked briefly at a fix that used a promise as in the old ~Thread implementation... since neither approach seemed like a clear winner in terms of audit-ability, I went with the solution I already had in place.

tobrun pushed a commit that referenced this issue Dec 6, 2017
Because a message we queue from the foreground may cause the background to complete, exit, and tear down the AsyncTask, we have to block queue processing until we've finished our call to AsyncTask::send().
Broadening the scope of a mutex is scary, but I audited the code of our four implementations of AsyncTask and I don't see any way this could cause a deadlock.
tobrun pushed a commit that referenced this issue Dec 6, 2017
Because a message we queue from the foreground may cause the background to complete, exit, and tear down the AsyncTask, we have to block queue processing until we've finished our call to AsyncTask::send().
Broadening the scope of a mutex is scary, but I audited the code of our four implementations of AsyncTask and I don't see any way this could cause a deadlock.
mappy-mobile pushed a commit to Mappy/mapbox-gl-native that referenced this issue Dec 11, 2017
* mapbox_release5.2.1: (29 commits)
  [android] - update changelog for 5.2.1 release
  [ios, macos] Rename the iOS and macOS SDKs (mapbox#10610)
  [core, ios, qt, android] Close race condition in RunLoop (issue mapbox#9620) Because a message we queue from the foreground may cause the background to complete, exit, and tear down the AsyncTask, we have to block queue processing until we've finished our call to AsyncTask::send(). Broadening the scope of a mutex is scary, but I audited the code of our four implementations of AsyncTask and I don't see any way this could cause a deadlock.
  [android] - add FileSource activation/deactivation to MapSnapshotter, handle multiple deactivate scenario in FileSource (mapbox#10556)
  [android] - handle destroying activity programmatically as part of theme switching (mapbox#10589)
  [android] - use concurrent lists for camera change listeners (mapbox#10542)
  [android] - harden MarkerView integration by checking for null bitmap (mapbox#10532)
  [android] - activate filesource to list offline regions (mapbox#10531)
  [android] Enable map rendering when app is paused
  [ios, macos] Snapshot classes added to jazzy
  [android] remove unnecessary jar generation from gradle-publish.gradle (mapbox#10625)
  [ios, macos] Refactor snapshot attribution.
  [macos] Fixed logo view distortion on macOS High Sierra
  [ios, macos] Update changelogs.
  [ios, macos] Fix an issue that triggers didSelectAnnotations for MGLAnnotationImage based annotations.
  [ios] Fix minimumZoomLevel is not getting set.
  [android] - attribtuion anchor point calculation fix for short text with full logo on a MapSnapshot (mapbox#10558)
  [android] use location engine abstraction instead of location source (lost) in MyLocationView#init (mapbox#10579)
  [build] Added CircleCI macos-release-node{4,6} jobs
  [android] Set a larger limit for the HTTP dispatcher (mapbox#10567)
  ...

# Conflicts:
#	platform/android/CHANGELOG.md
#	platform/android/MapboxGLAndroidSDK/gradle-publish.gradle
#	platform/android/MapboxGLAndroidSDK/gradle.properties
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

3 participants