nghttp2
nghttp2 copied to clipboard
thread data race in nghttp2::asio_http2::server.stop()
Rough outline of how I'm calling http2
boost::system::error_code ec;
std::string addr = "127.0.0.1";
std::string port = "3000";
std::size_t num_threads = 1;
server.num_threads(num_threads);
server.handle("/", [this](const request& req, const response& res) {
res.write_head(201, {{"foo", {"bar", false}}});
res.end(mypayload);
});
tls.use_private_key(boost::asio::const_buffer(testSslKey, strlen(testSslKey)), boost::asio::ssl::context::pem);
tls.use_certificate_chain(boost::asio::const_buffer(testSslCertPem, strlen(testSslCertPem)));
configure_tls_context_easy(ec, tls);
server.listen_and_serve(ec, tls, addr, port, true);
// Later, when we're done
server.stop();
Notice that listen_and_serve passes true
for async. When stop() is called, there's a data race. Here's all the gory details from thread sanitizer:
WARNING: ThreadSanitizer: data race (pid=76397)
Write of size 4 at 0x7b0800001288 by main thread:
#0 boost::asio::detail::reactive_socket_service_base::construct(boost::asio::detail::reactive_socket_service_base::base_implementation_type&) reactive_socket_service_base.ipp:46 (network_api_test:x86_64+0x1001815a9)
#1 boost::asio::detail::reactive_socket_service_base::close(boost::asio::detail::reactive_socket_service_base::base_implementation_type&, boost::system::error_code&) reactive_socket_service_base.ipp:128 (network_api_test:x86_64+0x1001942cc)
#2 boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>::close() basic_socket_acceptor.hpp:536 (network_api_test:x86_64+0x100174a66)
#3 nghttp2::asio_http2::server::server::stop() asio_server.cc:191 (network_api_test:x86_64+0x1001749cf)
#4 nghttp2::asio_http2::server::http2_impl::stop() asio_server_http2_impl.cc:72 (network_api_test:x86_64+0x100170131)
#5 nghttp2::asio_http2::server::http2::stop() asio_server_http2.cc:84 (network_api_test:x86_64+0x100168521)
#6 snap::network_api::NetworkApiTest::TearDown() NetworkApiTest.cpp:185 (network_api_test:x86_64+0x10000d15e)
#7 void testing::internal::HandleSehExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) gmock-gtest-all.cc:3909 (network_api_test:x86_64+0x100230fd4)
#8 void testing::internal::HandleExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) gmock-gtest-all.cc:3945 (network_api_test:x86_64+0x1001f4225)
#9 testing::Test::Run() gmock-gtest-all.cc:3992 (network_api_test:x86_64+0x1001f41b2)
#10 testing::TestInfo::Run() gmock-gtest-all.cc:4165 (network_api_test:x86_64+0x1001f4ff6)
#11 testing::TestCase::Run() gmock-gtest-all.cc:4287 (network_api_test:x86_64+0x1001f5ec1)
#12 testing::internal::UnitTestImpl::RunAllTests() gmock-gtest-all.cc:6678 (network_api_test:x86_64+0x1001ff382)
#13 bool testing::internal::HandleSehExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool>(testing::internal::UnitTestImpl*, bool (testing::internal::UnitTestImpl::*)(), char const*) gmock-gtest-all.cc:3909 (network_api_test:x86_64+0x1002346a4)
#14 bool testing::internal::HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool>(testing::internal::UnitTestImpl*, bool (testing::internal::UnitTestImpl::*)(), char const*) gmock-gtest-all.cc:3945 (network_api_test:x86_64+0x1001fefa5)
#15 testing::UnitTest::Run() gmock-gtest-all.cc:6286 (network_api_test:x86_64+0x1001fee99)
#16 RUN_ALL_TESTS() gtest.h:17081 (network_api_test:x86_64+0x1002460bb)
#17 main gmock_main.cc:54 (network_api_test:x86_64+0x100246078)
Previous read of size 4 at 0x7b0800001288 by thread T1:
#0 boost::asio::detail::reactive_socket_service_base::is_open(boost::asio::detail::reactive_socket_service_base::base_implementation_type const&) const reactive_socket_service_base.hpp:90 (network_api_test:x86_64+0x100183549)
#1 boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>::is_open() const basic_socket_acceptor.hpp:420 (network_api_test:x86_64+0x100174511)
#2 nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&) asio_server.cc:128 (network_api_test:x86_64+0x100173c0d)
#3 nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0::operator()(boost::system::error_code const&) const asio_server.cc:161 (network_api_test:x86_64+0x10019115a)
#4 boost::asio::detail::binder1<nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0, boost::system::error_code>::operator()() bind_handler.hpp:65 (network_api_test:x86_64+0x10019104d)
#5 void boost::asio::asio_handler_invoke<boost::asio::detail::binder1<nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0, boost::system::error_code> >(boost::asio::detail::binder1<nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0, boost::system::error_code>&, ...) handler_invoke_hook.hpp:69 (network_api_test:x86_64+0x100191009)
#6 void boost_asio_handler_invoke_helpers::invoke<boost::asio::detail::binder1<nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0, boost::system::error_code>, nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0>(boost::asio::detail::binder1<nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0, boost::system::error_code>&, nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0&) handler_invoke_helpers.hpp:37 (network_api_test:x86_64+0x100190fc9)
#7 void boost::asio::detail::handler_work<nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0, boost::asio::system_executor>::complete<boost::asio::detail::binder1<nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0, boost::system::error_code> >(boost::asio::detail::binder1<nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0, boost::system::error_code>&, nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0&) handler_work.hpp:82 (network_api_test:x86_64+0x100190b20)
#8 boost::asio::detail::reactive_socket_accept_op<boost::asio::basic_socket<boost::asio::ip::tcp>, boost::asio::ip::tcp, nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0>::do_complete(void*, boost::asio::detail::scheduler_operation*, boost::system::error_code const&, unsigned long) reactive_socket_accept_op.hpp:137 (network_api_test:x86_64+0x100190799)
#9 boost::asio::detail::scheduler_operation::complete(void*, boost::system::error_code const&, unsigned long) scheduler_operation.hpp:40 (network_api_test:x86_64+0x10017c767)
#10 boost::asio::detail::scheduler::do_run_one(boost::asio::detail::conditionally_enabled_mutex::scoped_lock&, boost::asio::detail::scheduler_thread_info&, boost::system::error_code const&) scheduler.ipp:401 (network_api_test:x86_64+0x10017bf09)
#11 boost::asio::detail::scheduler::run(boost::system::error_code&) scheduler.ipp:154 (network_api_test:x86_64+0x10017bb40)
#12 boost::asio::io_context::run() io_context.ipp:62 (network_api_test:x86_64+0x10017ba67)
#13 decltype(*(std::__1::forward<std::__1::shared_ptr<boost::asio::io_context> >(fp0)).*fp()) std::__1::__invoke<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context>, void>(unsigned long (boost::asio::io_context::*&&)(), std::__1::shared_ptr<boost::asio::io_context>&&) type_traits:4280 (network_api_test:x86_64+0x100164329)
#14 unsigned long std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> >::__execute<1ul>(std::__1::__tuple_indices<1ul>) future:2325 (network_api_test:x86_64+0x100164290)
#15 std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> >::operator()() future:2318 (network_api_test:x86_64+0x100163e19)
#16 std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >::__execute() future:986 (network_api_test:x86_64+0x100163824)
#17 decltype(*(std::__1::forward<std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >*>(fp0)).*fp()) std::__1::__invoke<void (std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >::*)(), std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >*, void>(void (std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >::*&&)(), std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >*&&) type_traits:4280 (network_api_test:x86_64+0x1001653ca)
#18 void std::__1::__thread_execute<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, void (std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >::*)(), std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >*, 2ul>(std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, void (std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >::*)(), std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >*>&, std::__1::__tuple_indices<2ul>) thread:342 (network_api_test:x86_64+0x100165270)
#19 void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, void (std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >::*)(), std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >*> >(void*) thread:352 (network_api_test:x86_64+0x1001649ba)
Location is heap block of size 32 at 0x7b0800001280 allocated by main thread:
#0 operator new(unsigned long) <null> (libclang_rt.tsan_osx_dynamic.dylib:x86_64h+0x6f00b)
#1 std::__1::__libcpp_allocate(unsigned long, unsigned long) new:252 (network_api_test:x86_64+0x1001753e9)
#2 std::__1::allocator<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp> >::allocate(unsigned long, void const*) memory:1813 (network_api_test:x86_64+0x100184bb6)
#3 std::__1::allocator_traits<std::__1::allocator<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp> > >::allocate(std::__1::allocator<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp> >&, unsigned long) memory:1546 (network_api_test:x86_64+0x100184a89)
#4 std::__1::__split_buffer<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>, std::__1::allocator<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp> >&>::__split_buffer(unsigned long, unsigned long, std::__1::allocator<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp> >&) __split_buffer:311 (network_api_test:x86_64+0x1001849c8)
#5 std::__1::__split_buffer<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>, std::__1::allocator<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp> >&>::__split_buffer(unsigned long, unsigned long, std::__1::allocator<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp> >&) __split_buffer:310 (network_api_test:x86_64+0x1001847c0)
#6 void std::__1::vector<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>, std::__1::allocator<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp> > >::__push_back_slow_path<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp> >(boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&&) vector:1611 (network_api_test:x86_64+0x100184289)
#7 std::__1::vector<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>, std::__1::allocator<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp> > >::push_back(boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&&) vector:1652 (network_api_test:x86_64+0x100174389)
#8 nghttp2::asio_http2::server::server::bind_and_listen(boost::system::error_code&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int) asio_server.cc:111 (network_api_test:x86_64+0x1001739e6)
#9 nghttp2::asio_http2::server::server::listen_and_serve(boost::system::error_code&, boost::asio::ssl::context*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int, nghttp2::asio_http2::server::serve_mux&, bool) asio_server.cc:61 (network_api_test:x86_64+0x10017374d)
#10 nghttp2::asio_http2::server::http2_impl::listen_and_serve(boost::system::error_code&, boost::asio::ssl::context*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool) asio_server_http2_impl.cc:51 (network_api_test:x86_64+0x10016fdc2)
#11 nghttp2::asio_http2::server::http2::listen_and_serve(boost::system::error_code&, boost::asio::ssl::context&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool) asio_server_http2.cc:65 (network_api_test:x86_64+0x1001681e9)
#12 snap::network_api::NetworkApiTest::SetUp() NetworkApiTest.cpp:166 (network_api_test:x86_64+0x10000cfa5)
#13 void testing::internal::HandleSehExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) gmock-gtest-all.cc:3909 (network_api_test:x86_64+0x100230fd4)
#14 void testing::internal::HandleExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) gmock-gtest-all.cc:3945 (network_api_test:x86_64+0x1001f4225)
#15 testing::Test::Run() gmock-gtest-all.cc:3979 (network_api_test:x86_64+0x1001f413c)
#16 testing::TestInfo::Run() gmock-gtest-all.cc:4165 (network_api_test:x86_64+0x1001f4ff6)
#17 testing::TestCase::Run() gmock-gtest-all.cc:4287 (network_api_test:x86_64+0x1001f5ec1)
#18 testing::internal::UnitTestImpl::RunAllTests() gmock-gtest-all.cc:6678 (network_api_test:x86_64+0x1001ff382)
#19 bool testing::internal::HandleSehExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool>(testing::internal::UnitTestImpl*, bool (testing::internal::UnitTestImpl::*)(), char const*) gmock-gtest-all.cc:3909 (network_api_test:x86_64+0x1002346a4)
#20 bool testing::internal::HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool>(testing::internal::UnitTestImpl*, bool (testing::internal::UnitTestImpl::*)(), char const*) gmock-gtest-all.cc:3945 (network_api_test:x86_64+0x1001fefa5)
#21 testing::UnitTest::Run() gmock-gtest-all.cc:6286 (network_api_test:x86_64+0x1001fee99)
#22 RUN_ALL_TESTS() gtest.h:17081 (network_api_test:x86_64+0x1002460bb)
#23 main gmock_main.cc:54 (network_api_test:x86_64+0x100246078)
Thread T1 (tid=6736366, running) created by main thread at:
#0 pthread_create <null> (libclang_rt.tsan_osx_dynamic.dylib:x86_64h+0x2a17d)
#1 std::__1::__libcpp_thread_create(_opaque_pthread_t**, void* (*)(void*), void*) __threading_support:328 (network_api_test:x86_64+0x100164939)
#2 std::__1::thread::thread<void (std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >::*)(), std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >*, void>(void (std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >::*&&)(), std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >*&&) thread:368 (network_api_test:x86_64+0x1001646c0)
#3 std::__1::thread::thread<void (std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >::*)(), std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >*, void>(void (std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >::*&&)(), std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >*&&) thread:360 (network_api_test:x86_64+0x1001635a9)
#4 std::__1::future<unsigned long> std::__1::__make_async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >(std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> >&&) future:2296 (network_api_test:x86_64+0x1001631d5)
#5 std::__1::future<std::__1::__invoke_of<std::__1::decay<unsigned long (boost::asio::io_context::*)()>::type, std::__1::decay<std::__1::shared_ptr<boost::asio::io_context>&>::type>::type> std::__1::async<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context>&>(std::__1::launch, unsigned long (boost::asio::io_context::*&&)(), std::__1::shared_ptr<boost::asio::io_context>&&&) future:2345 (network_api_test:x86_64+0x10015ce9e)
#6 nghttp2::asio_http2::io_service_pool::run(bool) asio_io_service_pool.cc:60 (network_api_test:x86_64+0x10015ccb0)
#7 nghttp2::asio_http2::server::server::listen_and_serve(boost::system::error_code&, boost::asio::ssl::context*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int, nghttp2::asio_http2::server::serve_mux&, bool) asio_server.cc:73 (network_api_test:x86_64+0x1001737f4)
#8 nghttp2::asio_http2::server::http2_impl::listen_and_serve(boost::system::error_code&, boost::asio::ssl::context*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool) asio_server_http2_impl.cc:51 (network_api_test:x86_64+0x10016fdc2)
#9 nghttp2::asio_http2::server::http2::listen_and_serve(boost::system::error_code&, boost::asio::ssl::context&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool) asio_server_http2.cc:65 (network_api_test:x86_64+0x1001681e9)
#10 snap::network_api::NetworkApiTest::SetUp() NetworkApiTest.cpp:166 (network_api_test:x86_64+0x10000cfa5)
#11 void testing::internal::HandleSehExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) gmock-gtest-all.cc:3909 (network_api_test:x86_64+0x100230fd4)
#12 void testing::internal::HandleExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) gmock-gtest-all.cc:3945 (network_api_test:x86_64+0x1001f4225)
#13 testing::Test::Run() gmock-gtest-all.cc:3979 (network_api_test:x86_64+0x1001f413c)
#14 testing::TestInfo::Run() gmock-gtest-all.cc:4165 (network_api_test:x86_64+0x1001f4ff6)
#15 testing::TestCase::Run() gmock-gtest-all.cc:4287 (network_api_test:x86_64+0x1001f5ec1)
#16 testing::internal::UnitTestImpl::RunAllTests() gmock-gtest-all.cc:6678 (network_api_test:x86_64+0x1001ff382)
#17 bool testing::internal::HandleSehExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool>(testing::internal::UnitTestImpl*, bool (testing::internal::UnitTestImpl::*)(), char const*) gmock-gtest-all.cc:3909 (network_api_test:x86_64+0x1002346a4)
#18 bool testing::internal::HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool>(testing::internal::UnitTestImpl*, bool (testing::internal::UnitTestImpl::*)(), char const*) gmock-gtest-all.cc:3945 (network_api_test:x86_64+0x1001fefa5)
#19 testing::UnitTest::Run() gmock-gtest-all.cc:6286 (network_api_test:x86_64+0x1001fee99)
#20 RUN_ALL_TESTS() gtest.h:17081 (network_api_test:x86_64+0x1002460bb)
#21 main gmock_main.cc:54 (network_api_test:x86_64+0x100246078)
SUMMARY: ThreadSanitizer: data race reactive_socket_service_base.ipp:46 in boost::asio::detail::reactive_socket_service_base::construct(boost::asio::detail::reactive_socket_service_base::base_implementation_type&)
==================
==================
WARNING: ThreadSanitizer: data race (pid=76397)
Read of size 4 at 0x7b0800001288 by thread T1:
#0 void boost::asio::detail::reactive_socket_service<boost::asio::ip::tcp>::async_accept<boost::asio::basic_socket<boost::asio::ip::tcp>, nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0>(boost::asio::detail::reactive_socket_service<boost::asio::ip::tcp>::implementation_type&, boost::asio::basic_socket<boost::asio::ip::tcp>&, boost::asio::ip::basic_endpoint<boost::asio::ip::tcp>*, nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0&) reactive_socket_service.hpp:452 (network_api_test:x86_64+0x10019019f)
#1 boost::asio::async_result<std::__1::decay<nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0>::type, void (boost::system::error_code)>::return_type boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>::async_accept<boost::asio::ip::tcp, nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0>(boost::asio::basic_socket<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0&&, std::__1::enable_if<is_convertible<boost::asio::ip::tcp, boost::asio::ip::tcp>::value, void>::type*) basic_socket_acceptor.hpp:1272 (network_api_test:x86_64+0x10017461f)
#2 nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&) asio_server.cc:136 (network_api_test:x86_64+0x100173c83)
#3 nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0::operator()(boost::system::error_code const&) const asio_server.cc:161 (network_api_test:x86_64+0x10019115a)
#4 boost::asio::detail::binder1<nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0, boost::system::error_code>::operator()() bind_handler.hpp:65 (network_api_test:x86_64+0x10019104d)
#5 void boost::asio::asio_handler_invoke<boost::asio::detail::binder1<nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0, boost::system::error_code> >(boost::asio::detail::binder1<nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0, boost::system::error_code>&, ...) handler_invoke_hook.hpp:69 (network_api_test:x86_64+0x100191009)
#6 void boost_asio_handler_invoke_helpers::invoke<boost::asio::detail::binder1<nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0, boost::system::error_code>, nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0>(boost::asio::detail::binder1<nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0, boost::system::error_code>&, nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0&) handler_invoke_helpers.hpp:37 (network_api_test:x86_64+0x100190fc9)
#7 void boost::asio::detail::handler_work<nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0, boost::asio::system_executor>::complete<boost::asio::detail::binder1<nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0, boost::system::error_code> >(boost::asio::detail::binder1<nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0, boost::system::error_code>&, nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0&) handler_work.hpp:82 (network_api_test:x86_64+0x100190b20)
#8 boost::asio::detail::reactive_socket_accept_op<boost::asio::basic_socket<boost::asio::ip::tcp>, boost::asio::ip::tcp, nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0>::do_complete(void*, boost::asio::detail::scheduler_operation*, boost::system::error_code const&, unsigned long) reactive_socket_accept_op.hpp:137 (network_api_test:x86_64+0x100190799)
#9 boost::asio::detail::scheduler_operation::complete(void*, boost::system::error_code const&, unsigned long) scheduler_operation.hpp:40 (network_api_test:x86_64+0x10017c767)
#10 boost::asio::detail::scheduler::do_run_one(boost::asio::detail::conditionally_enabled_mutex::scoped_lock&, boost::asio::detail::scheduler_thread_info&, boost::system::error_code const&) scheduler.ipp:401 (network_api_test:x86_64+0x10017bf09)
#11 boost::asio::detail::scheduler::run(boost::system::error_code&) scheduler.ipp:154 (network_api_test:x86_64+0x10017bb40)
#12 boost::asio::io_context::run() io_context.ipp:62 (network_api_test:x86_64+0x10017ba67)
#13 decltype(*(std::__1::forward<std::__1::shared_ptr<boost::asio::io_context> >(fp0)).*fp()) std::__1::__invoke<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context>, void>(unsigned long (boost::asio::io_context::*&&)(), std::__1::shared_ptr<boost::asio::io_context>&&) type_traits:4280 (network_api_test:x86_64+0x100164329)
#14 unsigned long std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> >::__execute<1ul>(std::__1::__tuple_indices<1ul>) future:2325 (network_api_test:x86_64+0x100164290)
#15 std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> >::operator()() future:2318 (network_api_test:x86_64+0x100163e19)
#16 std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >::__execute() future:986 (network_api_test:x86_64+0x100163824)
#17 decltype(*(std::__1::forward<std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >*>(fp0)).*fp()) std::__1::__invoke<void (std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >::*)(), std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >*, void>(void (std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >::*&&)(), std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >*&&) type_traits:4280 (network_api_test:x86_64+0x1001653ca)
#18 void std::__1::__thread_execute<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, void (std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >::*)(), std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >*, 2ul>(std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, void (std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >::*)(), std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >*>&, std::__1::__tuple_indices<2ul>) thread:342 (network_api_test:x86_64+0x100165270)
#19 void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, void (std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >::*)(), std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >*> >(void*) thread:352 (network_api_test:x86_64+0x1001649ba)
Previous write of size 4 at 0x7b0800001288 by main thread:
#0 boost::asio::detail::reactive_socket_service_base::construct(boost::asio::detail::reactive_socket_service_base::base_implementation_type&) reactive_socket_service_base.ipp:46 (network_api_test:x86_64+0x1001815a9)
#1 boost::asio::detail::reactive_socket_service_base::close(boost::asio::detail::reactive_socket_service_base::base_implementation_type&, boost::system::error_code&) reactive_socket_service_base.ipp:128 (network_api_test:x86_64+0x1001942cc)
#2 boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>::close() basic_socket_acceptor.hpp:536 (network_api_test:x86_64+0x100174a66)
#3 nghttp2::asio_http2::server::server::stop() asio_server.cc:191 (network_api_test:x86_64+0x1001749cf)
#4 nghttp2::asio_http2::server::http2_impl::stop() asio_server_http2_impl.cc:72 (network_api_test:x86_64+0x100170131)
#5 nghttp2::asio_http2::server::http2::stop() asio_server_http2.cc:84 (network_api_test:x86_64+0x100168521)
#6 snap::network_api::NetworkApiTest::TearDown() NetworkApiTest.cpp:185 (network_api_test:x86_64+0x10000d15e)
#7 void testing::internal::HandleSehExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) gmock-gtest-all.cc:3909 (network_api_test:x86_64+0x100230fd4)
#8 void testing::internal::HandleExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) gmock-gtest-all.cc:3945 (network_api_test:x86_64+0x1001f4225)
#9 testing::Test::Run() gmock-gtest-all.cc:3992 (network_api_test:x86_64+0x1001f41b2)
#10 testing::TestInfo::Run() gmock-gtest-all.cc:4165 (network_api_test:x86_64+0x1001f4ff6)
#11 testing::TestCase::Run() gmock-gtest-all.cc:4287 (network_api_test:x86_64+0x1001f5ec1)
#12 testing::internal::UnitTestImpl::RunAllTests() gmock-gtest-all.cc:6678 (network_api_test:x86_64+0x1001ff382)
#13 bool testing::internal::HandleSehExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool>(testing::internal::UnitTestImpl*, bool (testing::internal::UnitTestImpl::*)(), char const*) gmock-gtest-all.cc:3909 (network_api_test:x86_64+0x1002346a4)
#14 bool testing::internal::HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool>(testing::internal::UnitTestImpl*, bool (testing::internal::UnitTestImpl::*)(), char const*) gmock-gtest-all.cc:3945 (network_api_test:x86_64+0x1001fefa5)
#15 testing::UnitTest::Run() gmock-gtest-all.cc:6286 (network_api_test:x86_64+0x1001fee99)
#16 RUN_ALL_TESTS() gtest.h:17081 (network_api_test:x86_64+0x1002460bb)
#17 main gmock_main.cc:54 (network_api_test:x86_64+0x100246078)
Location is heap block of size 32 at 0x7b0800001280 allocated by main thread:
#0 operator new(unsigned long) <null>:1062816 (libclang_rt.tsan_osx_dynamic.dylib:x86_64h+0x6f00b)
#1 std::__1::__libcpp_allocate(unsigned long, unsigned long) new:252 (network_api_test:x86_64+0x1001753e9)
#2 std::__1::allocator<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp> >::allocate(unsigned long, void const*) memory:1813 (network_api_test:x86_64+0x100184bb6)
#3 std::__1::allocator_traits<std::__1::allocator<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp> > >::allocate(std::__1::allocator<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp> >&, unsigned long) memory:1546 (network_api_test:x86_64+0x100184a89)
#4 std::__1::__split_buffer<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>, std::__1::allocator<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp> >&>::__split_buffer(unsigned long, unsigned long, std::__1::allocator<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp> >&) __split_buffer:311 (network_api_test:x86_64+0x1001849c8)
#5 std::__1::__split_buffer<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>, std::__1::allocator<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp> >&>::__split_buffer(unsigned long, unsigned long, std::__1::allocator<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp> >&) __split_buffer:310 (network_api_test:x86_64+0x1001847c0)
#6 void std::__1::vector<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>, std::__1::allocator<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp> > >::__push_back_slow_path<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp> >(boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&&) vector:1611 (network_api_test:x86_64+0x100184289)
#7 std::__1::vector<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>, std::__1::allocator<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp> > >::push_back(boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&&) vector:1652 (network_api_test:x86_64+0x100174389)
#8 nghttp2::asio_http2::server::server::bind_and_listen(boost::system::error_code&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int) asio_server.cc:111 (network_api_test:x86_64+0x1001739e6)
#9 nghttp2::asio_http2::server::server::listen_and_serve(boost::system::error_code&, boost::asio::ssl::context*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int, nghttp2::asio_http2::server::serve_mux&, bool) asio_server.cc:61 (network_api_test:x86_64+0x10017374d)
#10 nghttp2::asio_http2::server::http2_impl::listen_and_serve(boost::system::error_code&, boost::asio::ssl::context*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool) asio_server_http2_impl.cc:51 (network_api_test:x86_64+0x10016fdc2)
#11 nghttp2::asio_http2::server::http2::listen_and_serve(boost::system::error_code&, boost::asio::ssl::context&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool) asio_server_http2.cc:65 (network_api_test:x86_64+0x1001681e9)
#12 snap::network_api::NetworkApiTest::SetUp() NetworkApiTest.cpp:166 (network_api_test:x86_64+0x10000cfa5)
#13 void testing::internal::HandleSehExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) gmock-gtest-all.cc:3909 (network_api_test:x86_64+0x100230fd4)
#14 void testing::internal::HandleExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) gmock-gtest-all.cc:3945 (network_api_test:x86_64+0x1001f4225)
#15 testing::Test::Run() gmock-gtest-all.cc:3979 (network_api_test:x86_64+0x1001f413c)
#16 testing::TestInfo::Run() gmock-gtest-all.cc:4165 (network_api_test:x86_64+0x1001f4ff6)
#17 testing::TestCase::Run() gmock-gtest-all.cc:4287 (network_api_test:x86_64+0x1001f5ec1)
#18 testing::internal::UnitTestImpl::RunAllTests() gmock-gtest-all.cc:6678 (network_api_test:x86_64+0x1001ff382)
#19 bool testing::internal::HandleSehExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool>(testing::internal::UnitTestImpl*, bool (testing::internal::UnitTestImpl::*)(), char const*) gmock-gtest-all.cc:3909 (network_api_test:x86_64+0x1002346a4)
#20 bool testing::internal::HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool>(testing::internal::UnitTestImpl*, bool (testing::internal::UnitTestImpl::*)(), char const*) gmock-gtest-all.cc:3945 (network_api_test:x86_64+0x1001fefa5)
#21 testing::UnitTest::Run() gmock-gtest-all.cc:6286 (network_api_test:x86_64+0x1001fee99)
#22 RUN_ALL_TESTS() gtest.h:17081 (network_api_test:x86_64+0x1002460bb)
#23 main gmock_main.cc:54 (network_api_test:x86_64+0x100246078)
Thread T1 (tid=6736366, running) created by main thread at:
#0 pthread_create <null>:1062864 (libclang_rt.tsan_osx_dynamic.dylib:x86_64h+0x2a17d)
#1 std::__1::__libcpp_thread_create(_opaque_pthread_t**, void* (*)(void*), void*) __threading_support:328 (network_api_test:x86_64+0x100164939)
#2 std::__1::thread::thread<void (std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >::*)(), std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >*, void>(void (std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >::*&&)(), std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >*&&) thread:368 (network_api_test:x86_64+0x1001646c0)
#3 std::__1::thread::thread<void (std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >::*)(), std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >*, void>(void (std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >::*&&)(), std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >*&&) thread:360 (network_api_test:x86_64+0x1001635a9)
#4 std::__1::future<unsigned long> std::__1::__make_async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >(std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> >&&) future:2296 (network_api_test:x86_64+0x1001631d5)
#5 std::__1::future<std::__1::__invoke_of<std::__1::decay<unsigned long (boost::asio::io_context::*)()>::type, std::__1::decay<std::__1::shared_ptr<boost::asio::io_context>&>::type>::type> std::__1::async<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context>&>(std::__1::launch, unsigned long (boost::asio::io_context::*&&)(), std::__1::shared_ptr<boost::asio::io_context>&&&) future:2345 (network_api_test:x86_64+0x10015ce9e)
#6 nghttp2::asio_http2::io_service_pool::run(bool) asio_io_service_pool.cc:60 (network_api_test:x86_64+0x10015ccb0)
#7 nghttp2::asio_http2::server::server::listen_and_serve(boost::system::error_code&, boost::asio::ssl::context*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int, nghttp2::asio_http2::server::serve_mux&, bool) asio_server.cc:73 (network_api_test:x86_64+0x1001737f4)
#8 nghttp2::asio_http2::server::http2_impl::listen_and_serve(boost::system::error_code&, boost::asio::ssl::context*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool) asio_server_http2_impl.cc:51 (network_api_test:x86_64+0x10016fdc2)
#9 nghttp2::asio_http2::server::http2::listen_and_serve(boost::system::error_code&, boost::asio::ssl::context&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool) asio_server_http2.cc:65 (network_api_test:x86_64+0x1001681e9)
#10 snap::network_api::NetworkApiTest::SetUp() NetworkApiTest.cpp:166 (network_api_test:x86_64+0x10000cfa5)
#11 void testing::internal::HandleSehExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) gmock-gtest-all.cc:3909 (network_api_test:x86_64+0x100230fd4)
#12 void testing::internal::HandleExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) gmock-gtest-all.cc:3945 (network_api_test:x86_64+0x1001f4225)
#13 testing::Test::Run() gmock-gtest-all.cc:3979 (network_api_test:x86_64+0x1001f413c)
#14 testing::TestInfo::Run() gmock-gtest-all.cc:4165 (network_api_test:x86_64+0x1001f4ff6)
#15 testing::TestCase::Run() gmock-gtest-all.cc:4287 (network_api_test:x86_64+0x1001f5ec1)
#16 testing::internal::UnitTestImpl::RunAllTests() gmock-gtest-all.cc:6678 (network_api_test:x86_64+0x1001ff382)
#17 bool testing::internal::HandleSehExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool>(testing::internal::UnitTestImpl*, bool (testing::internal::UnitTestImpl::*)(), char const*) gmock-gtest-all.cc:3909 (network_api_test:x86_64+0x1002346a4)
#18 bool testing::internal::HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool>(testing::internal::UnitTestImpl*, bool (testing::internal::UnitTestImpl::*)(), char const*) gmock-gtest-all.cc:3945 (network_api_test:x86_64+0x1001fefa5)
#19 testing::UnitTest::Run() gmock-gtest-all.cc:6286 (network_api_test:x86_64+0x1001fee99)
#20 RUN_ALL_TESTS() gtest.h:17081 (network_api_test:x86_64+0x1002460bb)
#21 main gmock_main.cc:54 (network_api_test:x86_64+0x100246078)
SUMMARY: ThreadSanitizer: data race reactive_socket_service.hpp:452 in void boost::asio::detail::reactive_socket_service<boost::asio::ip::tcp>::async_accept<boost::asio::basic_socket<boost::asio::ip::tcp>, nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0>(boost::asio::detail::reactive_socket_service<boost::asio::ip::tcp>::implementation_type&, boost::asio::basic_socket<boost::asio::ip::tcp>&, boost::asio::ip::basic_endpoint<boost::asio::ip::tcp>*, nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0&)
==================
==================
WARNING: ThreadSanitizer: data race (pid=76397)
Read of size 1 at 0x7b080000128c by thread T1:
#0 void boost::asio::detail::reactive_socket_service<boost::asio::ip::tcp>::async_accept<boost::asio::basic_socket<boost::asio::ip::tcp>, nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0>(boost::asio::detail::reactive_socket_service<boost::asio::ip::tcp>::implementation_type&, boost::asio::basic_socket<boost::asio::ip::tcp>&, boost::asio::ip::basic_endpoint<boost::asio::ip::tcp>*, nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0&) reactive_socket_service.hpp:452 (network_api_test:x86_64+0x1001901ab)
#1 boost::asio::async_result<std::__1::decay<nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0>::type, void (boost::system::error_code)>::return_type boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>::async_accept<boost::asio::ip::tcp, nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0>(boost::asio::basic_socket<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0&&, std::__1::enable_if<is_convertible<boost::asio::ip::tcp, boost::asio::ip::tcp>::value, void>::type*) basic_socket_acceptor.hpp:1272 (network_api_test:x86_64+0x10017461f)
#2 nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&) asio_server.cc:136 (network_api_test:x86_64+0x100173c83)
#3 nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0::operator()(boost::system::error_code const&) const asio_server.cc:161 (network_api_test:x86_64+0x10019115a)
#4 boost::asio::detail::binder1<nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0, boost::system::error_code>::operator()() bind_handler.hpp:65 (network_api_test:x86_64+0x10019104d)
#5 void boost::asio::asio_handler_invoke<boost::asio::detail::binder1<nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0, boost::system::error_code> >(boost::asio::detail::binder1<nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0, boost::system::error_code>&, ...) handler_invoke_hook.hpp:69 (network_api_test:x86_64+0x100191009)
#6 void boost_asio_handler_invoke_helpers::invoke<boost::asio::detail::binder1<nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0, boost::system::error_code>, nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0>(boost::asio::detail::binder1<nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0, boost::system::error_code>&, nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0&) handler_invoke_helpers.hpp:37 (network_api_test:x86_64+0x100190fc9)
#7 void boost::asio::detail::handler_work<nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0, boost::asio::system_executor>::complete<boost::asio::detail::binder1<nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0, boost::system::error_code> >(boost::asio::detail::binder1<nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0, boost::system::error_code>&, nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0&) handler_work.hpp:82 (network_api_test:x86_64+0x100190b20)
#8 boost::asio::detail::reactive_socket_accept_op<boost::asio::basic_socket<boost::asio::ip::tcp>, boost::asio::ip::tcp, nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0>::do_complete(void*, boost::asio::detail::scheduler_operation*, boost::system::error_code const&, unsigned long) reactive_socket_accept_op.hpp:137 (network_api_test:x86_64+0x100190799)
#9 boost::asio::detail::scheduler_operation::complete(void*, boost::system::error_code const&, unsigned long) scheduler_operation.hpp:40 (network_api_test:x86_64+0x10017c767)
#10 boost::asio::detail::scheduler::do_run_one(boost::asio::detail::conditionally_enabled_mutex::scoped_lock&, boost::asio::detail::scheduler_thread_info&, boost::system::error_code const&) scheduler.ipp:401 (network_api_test:x86_64+0x10017bf09)
#11 boost::asio::detail::scheduler::run(boost::system::error_code&) scheduler.ipp:154 (network_api_test:x86_64+0x10017bb40)
#12 boost::asio::io_context::run() io_context.ipp:62 (network_api_test:x86_64+0x10017ba67)
#13 decltype(*(std::__1::forward<std::__1::shared_ptr<boost::asio::io_context> >(fp0)).*fp()) std::__1::__invoke<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context>, void>(unsigned long (boost::asio::io_context::*&&)(), std::__1::shared_ptr<boost::asio::io_context>&&) type_traits:4280 (network_api_test:x86_64+0x100164329)
#14 unsigned long std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> >::__execute<1ul>(std::__1::__tuple_indices<1ul>) future:2325 (network_api_test:x86_64+0x100164290)
#15 std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> >::operator()() future:2318 (network_api_test:x86_64+0x100163e19)
#16 std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >::__execute() future:986 (network_api_test:x86_64+0x100163824)
#17 decltype(*(std::__1::forward<std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >*>(fp0)).*fp()) std::__1::__invoke<void (std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >::*)(), std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >*, void>(void (std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >::*&&)(), std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >*&&) type_traits:4280 (network_api_test:x86_64+0x1001653ca)
#18 void std::__1::__thread_execute<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, void (std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >::*)(), std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >*, 2ul>(std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, void (std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >::*)(), std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >*>&, std::__1::__tuple_indices<2ul>) thread:342 (network_api_test:x86_64+0x100165270)
#19 void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, void (std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >::*)(), std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >*> >(void*) thread:352 (network_api_test:x86_64+0x1001649ba)
Previous write of size 1 at 0x7b080000128c by main thread:
#0 boost::asio::detail::reactive_socket_service_base::construct(boost::asio::detail::reactive_socket_service_base::base_implementation_type&) reactive_socket_service_base.ipp:47 (network_api_test:x86_64+0x1001815b8)
#1 boost::asio::detail::reactive_socket_service_base::close(boost::asio::detail::reactive_socket_service_base::base_implementation_type&, boost::system::error_code&) reactive_socket_service_base.ipp:128 (network_api_test:x86_64+0x1001942cc)
#2 boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>::close() basic_socket_acceptor.hpp:536 (network_api_test:x86_64+0x100174a66)
#3 nghttp2::asio_http2::server::server::stop() asio_server.cc:191 (network_api_test:x86_64+0x1001749cf)
#4 nghttp2::asio_http2::server::http2_impl::stop() asio_server_http2_impl.cc:72 (network_api_test:x86_64+0x100170131)
#5 nghttp2::asio_http2::server::http2::stop() asio_server_http2.cc:84 (network_api_test:x86_64+0x100168521)
#6 snap::network_api::NetworkApiTest::TearDown() NetworkApiTest.cpp:185 (network_api_test:x86_64+0x10000d15e)
#7 void testing::internal::HandleSehExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) gmock-gtest-all.cc:3909 (network_api_test:x86_64+0x100230fd4)
#8 void testing::internal::HandleExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) gmock-gtest-all.cc:3945 (network_api_test:x86_64+0x1001f4225)
#9 testing::Test::Run() gmock-gtest-all.cc:3992 (network_api_test:x86_64+0x1001f41b2)
#10 testing::TestInfo::Run() gmock-gtest-all.cc:4165 (network_api_test:x86_64+0x1001f4ff6)
#11 testing::TestCase::Run() gmock-gtest-all.cc:4287 (network_api_test:x86_64+0x1001f5ec1)
#12 testing::internal::UnitTestImpl::RunAllTests() gmock-gtest-all.cc:6678 (network_api_test:x86_64+0x1001ff382)
#13 bool testing::internal::HandleSehExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool>(testing::internal::UnitTestImpl*, bool (testing::internal::UnitTestImpl::*)(), char const*) gmock-gtest-all.cc:3909 (network_api_test:x86_64+0x1002346a4)
#14 bool testing::internal::HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool>(testing::internal::UnitTestImpl*, bool (testing::internal::UnitTestImpl::*)(), char const*) gmock-gtest-all.cc:3945 (network_api_test:x86_64+0x1001fefa5)
#15 testing::UnitTest::Run() gmock-gtest-all.cc:6286 (network_api_test:x86_64+0x1001fee99)
#16 RUN_ALL_TESTS() gtest.h:17081 (network_api_test:x86_64+0x1002460bb)
#17 main gmock_main.cc:54 (network_api_test:x86_64+0x100246078)
Location is heap block of size 32 at 0x7b0800001280 allocated by main thread:
#0 operator new(unsigned long) <null>:1062816 (libclang_rt.tsan_osx_dynamic.dylib:x86_64h+0x6f00b)
#1 std::__1::__libcpp_allocate(unsigned long, unsigned long) new:252 (network_api_test:x86_64+0x1001753e9)
#2 std::__1::allocator<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp> >::allocate(unsigned long, void const*) memory:1813 (network_api_test:x86_64+0x100184bb6)
#3 std::__1::allocator_traits<std::__1::allocator<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp> > >::allocate(std::__1::allocator<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp> >&, unsigned long) memory:1546 (network_api_test:x86_64+0x100184a89)
#4 std::__1::__split_buffer<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>, std::__1::allocator<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp> >&>::__split_buffer(unsigned long, unsigned long, std::__1::allocator<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp> >&) __split_buffer:311 (network_api_test:x86_64+0x1001849c8)
#5 std::__1::__split_buffer<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>, std::__1::allocator<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp> >&>::__split_buffer(unsigned long, unsigned long, std::__1::allocator<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp> >&) __split_buffer:310 (network_api_test:x86_64+0x1001847c0)
#6 void std::__1::vector<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>, std::__1::allocator<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp> > >::__push_back_slow_path<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp> >(boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&&) vector:1611 (network_api_test:x86_64+0x100184289)
#7 std::__1::vector<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>, std::__1::allocator<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp> > >::push_back(boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&&) vector:1652 (network_api_test:x86_64+0x100174389)
#8 nghttp2::asio_http2::server::server::bind_and_listen(boost::system::error_code&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int) asio_server.cc:111 (network_api_test:x86_64+0x1001739e6)
#9 nghttp2::asio_http2::server::server::listen_and_serve(boost::system::error_code&, boost::asio::ssl::context*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int, nghttp2::asio_http2::server::serve_mux&, bool) asio_server.cc:61 (network_api_test:x86_64+0x10017374d)
#10 nghttp2::asio_http2::server::http2_impl::listen_and_serve(boost::system::error_code&, boost::asio::ssl::context*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool) asio_server_http2_impl.cc:51 (network_api_test:x86_64+0x10016fdc2)
#11 nghttp2::asio_http2::server::http2::listen_and_serve(boost::system::error_code&, boost::asio::ssl::context&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool) asio_server_http2.cc:65 (network_api_test:x86_64+0x1001681e9)
#12 snap::network_api::NetworkApiTest::SetUp() NetworkApiTest.cpp:166 (network_api_test:x86_64+0x10000cfa5)
#13 void testing::internal::HandleSehExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) gmock-gtest-all.cc:3909 (network_api_test:x86_64+0x100230fd4)
#14 void testing::internal::HandleExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) gmock-gtest-all.cc:3945 (network_api_test:x86_64+0x1001f4225)
#15 testing::Test::Run() gmock-gtest-all.cc:3979 (network_api_test:x86_64+0x1001f413c)
#16 testing::TestInfo::Run() gmock-gtest-all.cc:4165 (network_api_test:x86_64+0x1001f4ff6)
#17 testing::TestCase::Run() gmock-gtest-all.cc:4287 (network_api_test:x86_64+0x1001f5ec1)
#18 testing::internal::UnitTestImpl::RunAllTests() gmock-gtest-all.cc:6678 (network_api_test:x86_64+0x1001ff382)
#19 bool testing::internal::HandleSehExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool>(testing::internal::UnitTestImpl*, bool (testing::internal::UnitTestImpl::*)(), char const*) gmock-gtest-all.cc:3909 (network_api_test:x86_64+0x1002346a4)
#20 bool testing::internal::HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool>(testing::internal::UnitTestImpl*, bool (testing::internal::UnitTestImpl::*)(), char const*) gmock-gtest-all.cc:3945 (network_api_test:x86_64+0x1001fefa5)
#21 testing::UnitTest::Run() gmock-gtest-all.cc:6286 (network_api_test:x86_64+0x1001fee99)
#22 RUN_ALL_TESTS() gtest.h:17081 (network_api_test:x86_64+0x1002460bb)
#23 main gmock_main.cc:54 (network_api_test:x86_64+0x100246078)
Thread T1 (tid=6736366, running) created by main thread at:
#0 pthread_create <null>:1062864 (libclang_rt.tsan_osx_dynamic.dylib:x86_64h+0x2a17d)
#1 std::__1::__libcpp_thread_create(_opaque_pthread_t**, void* (*)(void*), void*) __threading_support:328 (network_api_test:x86_64+0x100164939)
#2 std::__1::thread::thread<void (std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >::*)(), std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >*, void>(void (std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >::*&&)(), std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >*&&) thread:368 (network_api_test:x86_64+0x1001646c0)
#3 std::__1::thread::thread<void (std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >::*)(), std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >*, void>(void (std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >::*&&)(), std::__1::__async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >*&&) thread:360 (network_api_test:x86_64+0x1001635a9)
#4 std::__1::future<unsigned long> std::__1::__make_async_assoc_state<unsigned long, std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> > >(std::__1::__async_func<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context> >&&) future:2296 (network_api_test:x86_64+0x1001631d5)
#5 std::__1::future<std::__1::__invoke_of<std::__1::decay<unsigned long (boost::asio::io_context::*)()>::type, std::__1::decay<std::__1::shared_ptr<boost::asio::io_context>&>::type>::type> std::__1::async<unsigned long (boost::asio::io_context::*)(), std::__1::shared_ptr<boost::asio::io_context>&>(std::__1::launch, unsigned long (boost::asio::io_context::*&&)(), std::__1::shared_ptr<boost::asio::io_context>&&&) future:2345 (network_api_test:x86_64+0x10015ce9e)
#6 nghttp2::asio_http2::io_service_pool::run(bool) asio_io_service_pool.cc:60 (network_api_test:x86_64+0x10015ccb0)
#7 nghttp2::asio_http2::server::server::listen_and_serve(boost::system::error_code&, boost::asio::ssl::context*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int, nghttp2::asio_http2::server::serve_mux&, bool) asio_server.cc:73 (network_api_test:x86_64+0x1001737f4)
#8 nghttp2::asio_http2::server::http2_impl::listen_and_serve(boost::system::error_code&, boost::asio::ssl::context*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool) asio_server_http2_impl.cc:51 (network_api_test:x86_64+0x10016fdc2)
#9 nghttp2::asio_http2::server::http2::listen_and_serve(boost::system::error_code&, boost::asio::ssl::context&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool) asio_server_http2.cc:65 (network_api_test:x86_64+0x1001681e9)
#10 snap::network_api::NetworkApiTest::SetUp() NetworkApiTest.cpp:166 (network_api_test:x86_64+0x10000cfa5)
#11 void testing::internal::HandleSehExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) gmock-gtest-all.cc:3909 (network_api_test:x86_64+0x100230fd4)
#12 void testing::internal::HandleExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) gmock-gtest-all.cc:3945 (network_api_test:x86_64+0x1001f4225)
#13 testing::Test::Run() gmock-gtest-all.cc:3979 (network_api_test:x86_64+0x1001f413c)
#14 testing::TestInfo::Run() gmock-gtest-all.cc:4165 (network_api_test:x86_64+0x1001f4ff6)
#15 testing::TestCase::Run() gmock-gtest-all.cc:4287 (network_api_test:x86_64+0x1001f5ec1)
#16 testing::internal::UnitTestImpl::RunAllTests() gmock-gtest-all.cc:6678 (network_api_test:x86_64+0x1001ff382)
#17 bool testing::internal::HandleSehExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool>(testing::internal::UnitTestImpl*, bool (testing::internal::UnitTestImpl::*)(), char const*) gmock-gtest-all.cc:3909 (network_api_test:x86_64+0x1002346a4)
#18 bool testing::internal::HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool>(testing::internal::UnitTestImpl*, bool (testing::internal::UnitTestImpl::*)(), char const*) gmock-gtest-all.cc:3945 (network_api_test:x86_64+0x1001fefa5)
#19 testing::UnitTest::Run() gmock-gtest-all.cc:6286 (network_api_test:x86_64+0x1001fee99)
#20 RUN_ALL_TESTS() gtest.h:17081 (network_api_test:x86_64+0x1002460bb)
#21 main gmock_main.cc:54 (network_api_test:x86_64+0x100246078)
SUMMARY: ThreadSanitizer: data race reactive_socket_service.hpp:452 in void boost::asio::detail::reactive_socket_service<boost::asio::ip::tcp>::async_accept<boost::asio::basic_socket<boost::asio::ip::tcp>, nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0>(boost::asio::detail::reactive_socket_service<boost::asio::ip::tcp>::implementation_type&, boost::asio::basic_socket<boost::asio::ip::tcp>&, boost::asio::ip::basic_endpoint<boost::asio::ip::tcp>*, nghttp2::asio_http2::server::server::start_accept(boost::asio::ssl::context&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, nghttp2::asio_http2::server::serve_mux&)::$_0&)
==================
Do you miss server.join()
before server.stop()
?
If so, check #1255.
Three years later :), the issue is that server.stop()
cannot be called from the main thread because ASIO is not thread safe like that. The easiest fix is to go through a timer, like this:
// notification to stop has to go through the asio io_context
for (const auto& service : server->io_services()) {
boost::asio::deadline_timer t{*service, boost::posix_time::pos_infin};
t.async_wait([server](const boost::system::error_code&) {
server->stop();
});
t.cancel();
}
server->join();
Closed since asio library has been removed.