boost-ext/di

Segfault with boost::asio, boost::sml and x86_64-w64-mingw32 compiler

rezahousseini opened this issue · 1 comments

When running this program in linux, all works fine, but with mingw I get a segfault in the deconstructor (this does not happen when not using boost::di).
My guess is that the io_context object gets destroyed before the serial_port.

The following backtrace gets produced:

Thread 1 received signal SIGSEGV, Segmentation fault.
0x00007ffb451fb5be in ntdll!RtlEnterCriticalSection () from /c/WINDOWS/SYSTEM32/ntdll.dll
(gdb) bt
#0  0x00007ffb451fb5be in ntdll!RtlEnterCriticalSection () from /c/WINDOWS/SYSTEM32/ntdll.dll
#1  0x00007ffb451fb3c0 in ntdll!RtlEnterCriticalSection () from /c/WINDOWS/SYSTEM32/ntdll.dll
#2  0x000000000042203c in boost::asio::detail::win_mutex::lock (this=0x8d1768) at /usr/x86_64-w64-mingw32.static/include/boost/asio/detail/win_mutex.hpp:50
#3  0x000000000041e389 in boost::asio::detail::scoped_lock<boost::asio::detail::win_mutex>::scoped_lock (this=0x80fa20, m=...)
    at /usr/x86_64-w64-mingw32.static/include/boost/asio/detail/scoped_lock.hpp:46
#4  0x0000000000421074 in boost::asio::detail::win_iocp_handle_service::destroy (this=0x8d1738, impl=...)
    at /usr/x86_64-w64-mingw32.static/include/boost/asio/detail/impl/win_iocp_handle_service.ipp:168
#5  0x0000000000421894 in boost::asio::detail::win_iocp_serial_port_service::destroy (this=0x8d1710, impl=...)
    at /usr/x86_64-w64-mingw32.static/include/boost/asio/detail/win_iocp_serial_port_service.hpp:76
#6  0x000000000041e953 in boost::asio::detail::io_object_impl<boost::asio::detail::win_iocp_serial_port_service, boost::asio::executor>::~io_object_impl (this=0x8d16a0,
    __in_chrg=<optimized out>) at /usr/x86_64-w64-mingw32.static/include/boost/asio/detail/io_object_impl.hpp:117
#7  0x000000000041d138 in boost::asio::basic_serial_port<boost::asio::executor>::~basic_serial_port (this=0x8d16a0, __in_chrg=<optimized out>)
    at /usr/x86_64-w64-mingw32.static/include/boost/asio/basic_serial_port.hpp:293
#8  0x0000000000423edc in __gnu_cxx::new_allocator<boost::asio::basic_serial_port<boost::asio::executor> >::destroy<boost::asio::basic_serial_port<boost::asio::executor> > (
    this=0x8d16a0, __p=0x8d16a0) at /usr/lib/gcc/x86_64-w64-mingw32.static/9.3.0/include/c++/ext/new_allocator.h:153
#9  0x000000000042d9e0 in std::allocator_traits<std::allocator<boost::asio::basic_serial_port<boost::asio::executor> > >::destroy<boost::asio::basic_serial_port<boost::asio::executor> > (__a=..., __p=0x8d16a0) at /usr/lib/gcc/x86_64-w64-mingw32.static/9.3.0/include/c++/bits/alloc_traits.h:497
#10 0x000000000042dd59 in std::_Sp_counted_ptr_inplace<boost::asio::basic_serial_port<boost::asio::executor>, std::allocator<boost::asio::basic_serial_port<boost::asio::executor> >, (__gnu_cxx::_Lock_policy)2>::_M_dispose (this=0x8d1690) at /usr/lib/gcc/x86_64-w64-mingw32.static/9.3.0/include/c++/bits/shared_ptr_base.h:557
#11 0x000000000042d8ff in std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release (this=0x8d1690)
    at /usr/lib/gcc/x86_64-w64-mingw32.static/9.3.0/include/c++/bits/shared_ptr_base.h:155
#12 0x000000000042d387 in std::__shared_count<(__gnu_cxx::_Lock_policy)2>::~__shared_count (this=0x8d1878, __in_chrg=<optimized out>)
    at /usr/lib/gcc/x86_64-w64-mingw32.static/9.3.0/include/c++/bits/shared_ptr_base.h:730
#13 0x000000000042c85c in std::__shared_ptr<boost::asio::basic_serial_port<boost::asio::executor>, (__gnu_cxx::_Lock_policy)2>::~__shared_ptr (this=0x8d1870,
    __in_chrg=<optimized out>) at /usr/lib/gcc/x86_64-w64-mingw32.static/9.3.0/include/c++/bits/shared_ptr_base.h:1169
#14 0x000000000042bfd8 in std::shared_ptr<boost::asio::basic_serial_port<boost::asio::executor> >::~shared_ptr (this=0x8d1870, __in_chrg=<optimized out>)
    at /usr/lib/gcc/x86_64-w64-mingw32.static/9.3.0/include/c++/bits/shared_ptr.h:103
#15 0x000000000041c4f8 in boost::ext::sml::v1_1_3::aux::pool_type<std::shared_ptr<boost::asio::basic_serial_port<boost::asio::executor> > >::~pool_type (this=0x8d1870,
    __in_chrg=<optimized out>) at ../subprojects/boost_sml/include/boost/sml.hpp:340
#16 0x000000000041c3c8 in boost::ext::sml::v1_1_3::aux::pool<std::shared_ptr<boost::asio::basic_serial_port<boost::asio::executor> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>::~pool (this=0x8d1870, __in_chrg=<optimized out>) at ../subprojects/boost_sml/include/boost/sml.hpp:388
#17 0x000000000042d527 in std::_Sp_counted_ptr<boost::ext::sml::v1_1_3::aux::pool<std::shared_ptr<boost::asio::basic_serial_port<boost::asio::executor> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>*, (__gnu_cxx::_Lock_policy)2>::_M_dispose (this=0x8d1c50)
    at /usr/lib/gcc/x86_64-w64-mingw32.static/9.3.0/include/c++/bits/shared_ptr_base.h:377
#18 0x000000000042d8ff in std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release (this=0x8d1c50)
    at /usr/lib/gcc/x86_64-w64-mingw32.static/9.3.0/include/c++/bits/shared_ptr_base.h:155
#19 0x000000000042d387 in std::__shared_count<(__gnu_cxx::_Lock_policy)2>::~__shared_count (
    this=0x434408 <boost::ext::di::v1_2_0::scopes::singleton::scope_impl<boost::ext::sml::v1_1_3::aux::pool<std::shared_ptr<boost::asio::basic_serial_port<boost::asio::executor> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>, boost::ext::di::v1_2_0::aux::integral_constant<bool, true> >::create_impl<boost::ext::sml::v1_1_3::aux::pool<std::shared_ptr<boost::asio::basic_serial_port<boost::asio::executor> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>, boost::ext::di::v1_2_0::core::successful::provider<boost::ext::di::v1_2_0::aux::pair<boost::ext::sml::v1_1_3::aux::pool<std::shared_ptr<boost::asio::basic_serial_port<boost::asio::executor> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>, boost::ext::di::v1_2_0::aux::pair<boost::ext::di::v1_2_0::type_traits::direct, boost::ext::sml::v1_1_3::aux::type_list<std::shared_ptr<boost::asio::basic_serial_port<boost::asio::executor> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&> > >, boost::ext::di::v1_2_0::core::injector<boost::ext::di::v1_2_0::config, boost::ext::di::v1_2_0::core::pool<boost::ext::di::v1_2_0::aux::type_list<> >, boost::ext::di::v1_2_0::core::dependency<boost::ext::di::v1_2_0::scopes::instance, boost::asio::basic_serial_port<boost::asio::executor>, std::shared_ptr<boost::asio::basic_serial_port<boost::asio::executor> >, boo--Type <RET> for more, q to quit, c to continue without paging--
st::ext::di::v1_2_0::no_name, void, boost::ext::di::v1_2_0::core::none>, boost::ext::di::v1_2_0::core::dependency<boost::ext::di::v1_2_0::scopes::instance, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, boost::ext::di::v1_2_0::no_name, void, boost::ext::di::v1_2_0::core::none> > > >(boost::ext::di::v1_2_0::core::successful::provider<boost::ext::di::v1_2_0::aux::pair<boost::ext::sml::v1_1_3::aux::pool<std::shared_ptr<boost::asio::basic_serial_port<boost::asio::executor> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>, boost::ext::di::v1_2_0::aux::pair<boost::ext::di::v1_2_0::type_traits::direct, boost::ext::sml::v1_1_3::aux::type_list<std::shared_ptr<boost::asio::basic_serial_port<boost::asio::executor> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&> > >, boost::ext::di::v1_2_0::core::injector<boost::ext::di::v1_2_0::config, boost::ext::di::v1_2_0::core::pool<boost::ext::di::v1_2_0::aux::type_list<> >, boost::ext::di::v1_2_0::core::dependency<boost::ext::di::v1_2_0::scopes::instance, boost::asio::basic_serial_port<boost::asio::executor>, std::shared_ptr<boost::asio::basic_serial_port<boost::asio::executor> >, boost::ext::di::v1_2_0::no_name, void, boost::ext::di::v1_2_0::core::none>, boost::ext::di::v1_2_0::core::dependency<boost::ext::di::v1_2_0::scopes::instance, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, boost::ext::di::v1_2_0::no_name, void, boost::ext::di::v1_2_0::core::none> > > const&)::object+8>, __in_chrg=<optimized out>)
    at /usr/lib/gcc/x86_64-w64-mingw32.static/9.3.0/include/c++/bits/shared_ptr_base.h:730
#20 0x000000000042c70c in std::__shared_ptr<boost::ext::sml::v1_1_3::aux::pool<std::shared_ptr<boost::asio::basic_serial_port<boost::asio::executor> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>, (__gnu_cxx::_Lock_policy)2>::~__shared_ptr (
    this=0x434400 <boost::ext::di::v1_2_0::scopes::singleton::scope_impl<boost::ext::sml::v1_1_3::aux::pool<std::shared_ptr<boost::asio::basic_serial_port<boost::asio::executor> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>, boost::ext::di::v1_2_0::aux::integral_constant<bool, true> >::create_impl<boost::ext::sml::v1_1_3::aux::pool<std::shared_ptr<boost::asio::basic_serial_port<boost::asio::executor> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>, boost::ext::di::v1_2_0::core::successful::provider<boost::ext::di::v1_2_0::aux::pair<boost::ext::sml::v1_1_3::aux::pool<std::shared_ptr<boost::asio::basic_serial_port<boost::asio::executor> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>, boost::ext::di::v1_2_0::aux::pair<boost::ext::di::v1_2_0::type_traits::direct, boost::ext::sml::v1_1_3::aux::type_list<std::shared_ptr<boost::asio::basic_serial_port<boost::asio::executor> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&> > >, boost::ext::di::v1_2_0::core::injector<boost::ext::di::v1_2_0::config, boost::ext::di::v1_2_0::core::pool<boost::ext::di::v1_2_0::aux::type_list<> >, boost::ext::di::v1_2_0::core::dependency<boost::ext::di::v1_2_0::scopes::instance, boost::asio::basic_serial_port<boost::asio::executor>, std::shared_ptr<boost::asio::basic_serial_port<boost::asio::executor> >, boost::ext::di::v1_2_0::no_name, void, boost::ext::di::v1_2_0::core::none>, boost::ext::di::v1_2_0::core::dependency<boost::ext::di::v1_2_0::scopes::instance, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, boost::ext::di::v1_2_0::no_name, void, boost::ext::di::v1_2_0::core::none> > > >(boost::ext::di::v1_2_0::core::successful::provider<boost::ext::di::v1_2_0::aux::pair<boost::ext::sml::v1_1_3::aux::pool<std::shared_ptr<boost::asio::basic_serial_port<boost::asio::executor> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>, boost::ext::di::v1_2_0::aux::pair<boost::ext::di::v1_2_0::type_traits::direct, boost::ext::sml::v1_1_3::aux::type_list<std::shared_ptr<boost::asio::basic_serial_port<boost::asio::executor> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&> > >, boost::ext::di::v1_2_0::core::injector<boost::ext::di::v1_2_0::config, boost::ext::di::v1_2_0::core::pool<boost::ext::di::v1_2_0::aux::type_list<> >, boost::ext::di::v1_2_0::core::dependency<boost::ext::di::v1_2_0::scopes::instance, boost::asio::basic_serial_port<boost::asio::executor>, std::shared_ptr<boost::asio::basic_serial_port<boost::asio::executor> >, boost::ext::di::v1_2_0::no_name, void, boost::ext::di::v1_2_0::core::none>, boost::ext::di::v1_2_0::core::dependency<boost::ext::di::v1_2_0::scopes::instance, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, boost::ext::di::v1_2_0::no_name, void, boost::ext::di::v1_2_0::core::none> > > const&)::object>, __in_chrg=<optimized out>)
    at /usr/lib/gcc/x86_64-w64-mingw32.static/9.3.0/include/c++/bits/shared_ptr_base.h:1169
#21 0x000000000042bef8 in std::shared_ptr<boost::ext::sml::v1_1_3::aux::pool<std::shared_ptr<boost::asio::basic_serial_port<boost::asio::executor> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&> >::~shared_ptr (
    this=0x434400 <boost::ext::di::v1_2_0::scopes::singleton::scope_impl<boost::ext::sml::v1_1_3::aux::pool<std::shared_ptr<boost::asio::basic_serial_port<boost::asio::executor> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>, boost::ext::di::v1_2_0::aux::integral_constant<bool, true> >::create_impl<boost::ext::sml::v1_1_3::aux::pool<std::shared_ptr<boost::asio::basic_serial_port<boost::asio::executor> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>, boost::ext::di::v1_2_0::core::successful::provider<boost::ext::di::v1_2_0::aux::pair<boost::ext::sml::v1_1_3::aux::pool<std::shared_ptr<boost::asio::basic_serial_port<boost::asio::executor> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>, boost::ext::di::v1_2_0::aux::pair<boost::ext::di::v1_2_0::type_traits::direct, boost::ext::sml::v1_1_3::aux::type_list<std::shared_ptr<boost::asio::basic_serial_port<boost::asio::executor> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&> > >, boost::ext::di::v1_2_0::core::injector<boost::ext::di::v1_2_0::config, boost::ext::di::v1_2_0::core::pool<boost::ext::di::v1_2_0::aux::type_list<> >, boost::ext::di::v1_2_0::core::dependency<boost::ext::di::v1_2_0::scopes::instance, boost::asio::basic_serial_port<boost::asio::executor>, std::shared_ptr<boost::asio::basic_serial_port<boost::asio::executor> >, boost::ext::di::v1_2_0::no_name, void, boost::ext::di::v1_2_0::core::none>, boost::ext::di::v1_2_0::core::dependency<boost::ext::di::v1_2_0::scopes::instance, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, boost::ext::di::v1_2_0::no_name, void, boost::ext::di::v1_2_0::core::none> > > >(boost::ext::di::v1_2_0::core::successful::provider<boost::ext::di::v1_2_0::aux::pair<boost::ext::sml::v1_1_3::aux::pool<std::shared_ptr<boost::asio::bas--Type <RET> for more, q to quit, c to continue without paging--
ic_serial_port<boost::asio::executor> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>, boost::ext::di::v1_2_0::aux::pair<boost::ext::di::v1_2_0::type_traits::direct, boost::ext::sml::v1_1_3::aux::type_list<std::shared_ptr<boost::asio::basic_serial_port<boost::asio::executor> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&> > >, boost::ext::di::v1_2_0::core::injector<boost::ext::di::v1_2_0::config, boost::ext::di::v1_2_0::core::pool<boost::ext::di::v1_2_0::aux::type_list<> >, boost::ext::di::v1_2_0::core::dependency<boost::ext::di::v1_2_0::scopes::instance, boost::asio::basic_serial_port<boost::asio::executor>, std::shared_ptr<boost::asio::basic_serial_port<boost::asio::executor> >, boost::ext::di::v1_2_0::no_name, void, boost::ext::di::v1_2_0::core::none>, boost::ext::di::v1_2_0::core::dependency<boost::ext::di::v1_2_0::scopes::instance, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, boost::ext::di::v1_2_0::no_name, void, boost::ext::di::v1_2_0::core::none> > > const&)::object>, __in_chrg=<optimized out>)
    at /usr/lib/gcc/x86_64-w64-mingw32.static/9.3.0/include/c++/bits/shared_ptr.h:103
#22 0x0000000000401ae5 in __tcf_1 () at ../subprojects/boost_di/include/boost/di.hpp:1898
#23 0x00007ffb4486a82b in msvcrt!_initterm_e () from /c/WINDOWS/System32/msvcrt.dll
#24 0x00000000004014b5 in __tmainCRTStartup () at ../gcc-9.3.0.build_/mingw-w64-v7.0.0/mingw-w64-crt/crt/crtexe.c:342
#25 0x000000000040150b in mainCRTStartup () at ../gcc-9.3.0.build_/mingw-w64-v7.0.0/mingw-w64-crt/crt/crtexe.c:223

I'm also unable to get it to compile when only passing the io_context object (instead of the serial_port):

int main()
{
  asio::io_context io_context;
  //auto serial_port = std::make_shared<asio::serial_port>(io_context);
  std::string com_port = "COM33";
  const auto injector = di::make_injector(
    //di::bind<>.to(serial_port),
    di::bind<>.to(io_context),
    di::bind<>.to(com_port));

  injector.create<session>().start();
};