arvidn / libtorrent

an efficient feature complete C++ bittorrent implementation
http://libtorrent.org
Other
5.1k stars 984 forks source link

Libtorrent crashes after adding new torrent file #7391

Open giesmininkas opened 1 year ago

giesmininkas commented 1 year ago

libtorrent version (or branch): v2.0.8 platform/architecture: Linux 6.1.0-7-amd64 Debian 6.1.20-1 (2023-03-19) x86_64 GNU/Linux compiler and compiler version: clang-15 with libc++-15

My application crashes right after adding this particular torrent file. I haven't observed anything similar in any other case. Reproduces in multiple different environments.

Libtorrent doesn't seem to emit any error messages/alerts regarding this.

The closest I've got to the possible problem is the following stack trace:

__interceptor___cxa_throw 0x000055555e817ff0
libtorrent::aux::throw_ex<…> throw.hpp:49
libtorrent::aux::open_file file.cpp:424
libtorrent::aux::file_handle::file_handle file.cpp:476
libtorrent::aux::file_view_pool::file_entry::file_entry file_view_pool.hpp:143
libtorrent::aux::file_view_pool::open_file_impl file_view_pool.cpp:272
libtorrent::aux::file_view_pool::open_file file_view_pool.cpp:167
libtorrent::mmap_storage::open_file_impl mmap_storage.cpp:912
libtorrent::mmap_storage::open_file mmap_storage.cpp:863
$_6::operator()(libtorrent::aux::strong_typedef<…>, long, libtorrent::span<…>, libtorrent::storage_error &) const mmap_storage.cpp:731
std::__invoke[abi:v15007]<…>($_6 &, libtorrent::aux::strong_typedef<…> &&, long &&, libtorrent::span<…> &&, libtorrent::storage_error &) invoke.h:394
std::__invoke_void_return_wrapper::__call<…>($_6 &, libtorrent::aux::strong_typedef<…> &&, long &&, libtorrent::span<…> &&, libtorrent::storage_error &) invoke.h:470
std::__function::__alloc_func::operator()[abi:v15007](libtorrent::aux::strong_typedef<…> &&, long &&, libtorrent::span<…> &&, libtorrent::storage_error &) function.h:185
std::__function::__func::operator()(libtorrent::aux::strong_typedef<…> &&, long &&, libtorrent::span<…> &&, libtorrent::storage_error &) function.h:359
std::__function::__value_func::operator()[abi:v15007](libtorrent::aux::strong_typedef<…> &&, long &&, libtorrent::span<…> &&, libtorrent::storage_error &) const function.h:512
std::function::operator()(libtorrent::aux::strong_typedef<…>, long, libtorrent::span<…>, libtorrent::storage_error &) const function.h:1197
libtorrent::aux::readwrite(const libtorrent::file_storage &, libtorrent::span<…>, libtorrent::aux::strong_typedef<…>, int, libtorrent::storage_error &, std::function<…>) storage_utils.cpp:116
libtorrent::mmap_storage::hash mmap_storage.cpp:705
libtorrent::mmap_disk_io::do_hash mmap_disk_io.cpp:1083
libtorrent::mmap_disk_io::perform_job mmap_disk_io.cpp:583
libtorrent::mmap_disk_io::execute_job mmap_disk_io.cpp:1457
libtorrent::mmap_disk_io::thread_fun mmap_disk_io.cpp:1596
libtorrent::mmap_disk_io::job_queue::thread_fun mmap_disk_io.cpp:253
std::__invoke[abi:v15007]<…>(void (libtorrent::aux::pool_thread_interface::*&&)(libtorrent::aux::disk_io_thread_pool &, boost::asio::executor_work_guard<…>), libtorrent::aux::pool_thread_interface *&&, std::reference_wrapper<…> &&, boost::asio::executor_work_guard<…> &&) invoke.h:359
std::__thread_execute[abi:v15007]<…>(std::tuple<…> &, std::__tuple_indices<…>) thread:284
std::__thread_proxy[abi:v15007]<…>(void *) thread:295
start_thread 0x00007ffff75a3fd4
clone3 0x00007ffff76245bc

Let me know about any other information I can provide.

Thanks for the help.

arvidn commented 1 year ago

can you provide more details about the "crash"? is it an assertion failure? Is it a SIGSEGV?

the stack trace you post is an exception being thrown because a file can't be opened (for some reason). This is normal and expected behavior. The exception is supposed to be caught and handled.

Did you build libtorrent with exceptions disabled by chance? (I don't think that's possible anymore, and not supported)

arvidn commented 1 year ago

also, would you mind posting the .torrent file on github? (the link you provided doesn't work)

giesmininkas commented 1 year ago

Hi. Yeah, sorry for the bad explanation of "crash". It seems to segfault at least on my local machine. I'll try to debug the segfault again.

No, I'm not building it with exceptions disabled.

Here's the torrent file: example.torrent.zip.

arvidn commented 1 year ago

__interceptor___cxa_throw this suggests that you have something enabled that intercepts exceptions. Is address sanitizer or undefined sanitizer enabled?

giesmininkas commented 1 year ago

Yes. My debug builds are with asan+ubsan enabled. Release builds are not, though.

Just got this asan warning:

Heap-use-after-free on address 0x621000070900 at pc 0x55555e82e26a bp 0x7fffe5bdd870 sp 0x7fffe5bdd040
WRITE of size 32 at 0x621000070900 thread T30
  at 0x55555e82e269 __asan_memcpy
  at 0x55555f72bb17 libtorrent::mmap_disk_io::do_hash(libtorrent::aux::mmap_disk_job*) (mmap_disk_io.cpp:1104)
  at 0x55555f7164a7 libtorrent::mmap_disk_io::perform_job(libtorrent::aux::mmap_disk_job*, libtorrent::tailqueue<libtorrent::aux::mmap_disk_job>&) (mmap_disk_io.cpp:583)
  at 0x55555f734b2e libtorrent::mmap_disk_io::execute_job(libtorrent::aux::mmap_disk_job*) (mmap_disk_io.cpp:1457)
  at 0x55555f7375de libtorrent::mmap_disk_io::thread_fun(libtorrent::mmap_disk_io::job_queue&, libtorrent::aux::disk_io_thread_pool&) (mmap_disk_io.cpp:1596)
  at 0x55555f73e14f libtorrent::mmap_disk_io::job_queue::thread_fun(libtorrent::aux::disk_io_thread_pool&, boost::asio::executor_work_guard<boost::asio::io_context::basic_executor_type<std::__1::allocator<void>, 0ul>, void, void>) (mmap_disk_io.cpp:253)
  at 0x55555f82329c decltype(*std::declval<libtorrent::aux::pool_thread_interface*>().*std::declval<void (libtorrent::aux::pool_thread_interface::*)(libtorrent::aux::disk_io_thread_pool&, boost::asio::executor_work_guard<boost::asio::io_context::basic_executor_type<std::__1::allocator<void>, 0ul>, void, void>)>()(std::declval<std::__1::reference_wrapper<libtorrent::aux::disk_io_thread_pool>>(), std::declval<boost::asio::executor_work_guard<boost::asio::io_context::basic_executor_type<std::__1::allocator<void>, 0ul>, void, void>>())) std::__1::__invoke[abi:v15007]<void (libtorrent::aux::pool_thread_interface::*)(libtorrent::aux::disk_io_thread_pool&, boost::asio::executor_work_guard<boost::asio::io_context::basic_executor_type<std::__1::allocator<void>, 0ul>, void, void>), libtorrent::aux::pool_thread_interface*, std::__1::reference_wrapper<libtorrent::aux::disk_io_thread_pool>, boost::asio::executor_work_guard<boost::asio::io_context::basic_executor_type<std::__1::allocator<void>, 0ul>, void, void>, void>(void (libtorrent::aux::pool_thread_interface::*&&)(libtorrent::aux::disk_io_thread_pool&, boost::asio::executor_work_guard<boost::asio::io_context::basic_executor_type<std::__1::allocator<void>, 0ul>, void, void>), libtorrent::aux::pool_thread_interface*&&, std::__1::reference_wrapper<libtorrent::aux::disk_io_thread_pool>&&, boost::asio::executor_work_guard<boost::asio::io_context::basic_executor_type<std::__1::allocator<void>, 0ul>, void, void>&&) (invoke.h:359)
  at 0x55555f822ff7 void std::__1::__thread_execute[abi:v15007]<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, void (libtorrent::aux::pool_thread_interface::*)(libtorrent::aux::disk_io_thread_pool&, boost::asio::executor_work_guard<boost::asio::io_context::basic_executor_type<std::__1::allocator<void>, 0ul>, void, void>), libtorrent::aux::pool_thread_interface*, std::__1::reference_wrapper<libtorrent::aux::disk_io_thread_pool>, boost::asio::executor_work_guard<boost::asio::io_context::basic_executor_type<std::__1::allocator<void>, 0ul>, void, void>, 2ul, 3ul, 4ul>(std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, void (libtorrent::aux::pool_thread_interface::*)(libtorrent::aux::disk_io_thread_pool&, boost::asio::executor_work_guard<boost::asio::io_context::basic_executor_type<std::__1::allocator<void>, 0ul>, void, void>), libtorrent::aux::pool_thread_interface*, std::__1::reference_wrapper<libtorrent::aux::disk_io_thread_pool>, boost::asio::executor_work_guard<boost::asio::io_context::basic_executor_type<std::__1::allocator<void>, 0ul>, void, void>>&, std::__1::__tuple_indices<2ul, 3ul, 4ul>) (thread:284)
  at 0x55555f8222bf void* std::__1::__thread_proxy[abi:v15007]<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, void (libtorrent::aux::pool_thread_interface::*)(libtorrent::aux::disk_io_thread_pool&, boost::asio::executor_work_guard<boost::asio::io_context::basic_executor_type<std::__1::allocator<void>, 0ul>, void, void>), libtorrent::aux::pool_thread_interface*, std::__1::reference_wrapper<libtorrent::aux::disk_io_thread_pool>, boost::asio::executor_work_guard<boost::asio::io_context::basic_executor_type<std::__1::allocator<void>, 0ul>, void, void>>>(void*) (thread:295)
  at 0x7ffff75a3fd3 start_thread (pthread_create.c:442)
  at 0x7ffff76245bb clone3 (clone3.S:81)
Freed by thread T1 here:
  at 0x55555e86996d operator delete(void*)
  at 0x55555e87092c void std::__1::__libcpp_operator_delete[abi:v15007]<void*>(void*) (new:256)
  at 0x55555e870900 void std::__1::__do_deallocate_handle_size[abi:v15007]<>(void*, unsigned long) (new:280)
  at 0x55555e8708d8 std::__1::__libcpp_deallocate[abi:v15007](void*, unsigned long, unsigned long) (new:290)
  at 0x55555f47ad1f std::__1::allocator<libtorrent::digest32<256l>>::deallocate[abi:v15007](libtorrent::digest32<256l>*, unsigned long) (allocator.h:128)
  at 0x55555f47a8fc std::__1::allocator_traits<std::__1::allocator<libtorrent::digest32<256l>>>::deallocate[abi:v15007](std::__1::allocator<libtorrent::digest32<256l>>&, libtorrent::digest32<256l>*, unsigned long) (allocator_traits.h:282)
  at 0x55555f47a687 std::__1::vector<libtorrent::digest32<256l>, std::__1::allocator<libtorrent::digest32<256l>>>::__destroy_vector::operator()[abi:v15007]() (vector:440)
  at 0x55555f47a309 std::__1::vector<libtorrent::digest32<256l>, std::__1::allocator<libtorrent::digest32<256l>>>::~vector[abi:v15007]() (vector:449)
  at 0x55555f56eb3f libtorrent::aux::container_wrapper<libtorrent::digest32<256l>, int, std::__1::vector<libtorrent::digest32<256l>, std::__1::allocator<libtorrent::digest32<256l>>>>::~container_wrapper() (container_wrapper.hpp:48)
  at 0x5555605183d3 libtorrent::torrent::on_piece_hashed(libtorrent::aux::container_wrapper<libtorrent::digest32<256l>, int, std::__1::vector<libtorrent::digest32<256l>, std::__1::allocator<libtorrent::digest32<256l>>>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)::$_32::~$_32() (torrent.cpp:2577)
  at 0x5555606e50df std::__1::__compressed_pair_elem<libtorrent::torrent::on_piece_hashed(libtorrent::aux::container_wrapper<libtorrent::digest32<256l>, int, std::__1::vector<libtorrent::digest32<256l>, std::__1::allocator<libtorrent::digest32<256l>>>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)::$_32, 0, false>::~__compressed_pair_elem() (compressed_pair.h:30)
  at 0x5555606e54cf std::__1::__compressed_pair<libtorrent::torrent::on_piece_hashed(libtorrent::aux::container_wrapper<libtorrent::digest32<256l>, int, std::__1::vector<libtorrent::digest32<256l>, std::__1::allocator<libtorrent::digest32<256l>>>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)::$_32, std::__1::allocator<libtorrent::torrent::on_piece_hashed(libtorrent::aux::container_wrapper<libtorrent::digest32<256l>, int, std::__1::vector<libtorrent::digest32<256l>, std::__1::allocator<libtorrent::digest32<256l>>>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)::$_32>>::~__compressed_pair() (compressed_pair.h:83)
  at 0x5555606e79a9 std::__1::__function::__alloc_func<libtorrent::torrent::on_piece_hashed(libtorrent::aux::container_wrapper<libtorrent::digest32<256l>, int, std::__1::vector<libtorrent::digest32<256l>, std::__1::allocator<libtorrent::digest32<256l>>>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)::$_32, std::__1::allocator<libtorrent::torrent::on_piece_hashed(libtorrent::aux::container_wrapper<libtorrent::digest32<256l>, int, std::__1::vector<libtorrent::digest32<256l>, std::__1::allocator<libtorrent::digest32<256l>>>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)::$_32>, void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>::destroy[abi:v15007]() (function.h:204)
  at 0x5555606e4173 std::__1::__function::__func<libtorrent::torrent::on_piece_hashed(libtorrent::aux::container_wrapper<libtorrent::digest32<256l>, int, std::__1::vector<libtorrent::digest32<256l>, std::__1::allocator<libtorrent::digest32<256l>>>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)::$_32, std::__1::allocator<libtorrent::torrent::on_piece_hashed(libtorrent::aux::container_wrapper<libtorrent::digest32<256l>, int, std::__1::vector<libtorrent::digest32<256l>, std::__1::allocator<libtorrent::digest32<256l>>>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)::$_32>, void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>::destroy_deallocate() (function.h:351)
  at 0x55555f5a7c2f std::__1::__function::__value_func<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>::~__value_func[abi:v15007]() (function.h:473)
  at 0x55555f56e83f std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>::~function() (function.h:1184)
  at 0x555560514926 libtorrent::torrent::on_piece_hashed(libtorrent::aux::container_wrapper<libtorrent::digest32<256l>, int, std::__1::vector<libtorrent::digest32<256l>, std::__1::allocator<libtorrent::digest32<256l>>>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&) (torrent.cpp:2576)
  at 0x5555606e81d2 libtorrent::torrent::on_piece_hashed(libtorrent::aux::container_wrapper<libtorrent::digest32<256l>, int, std::__1::vector<libtorrent::digest32<256l>, std::__1::allocator<libtorrent::digest32<256l>>>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)::$_32::operator()(libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&) const (torrent.cpp:2579)
  at 0x5555606e7e6a decltype(std::declval<libtorrent::torrent::on_piece_hashed(libtorrent::aux::container_wrapper<libtorrent::digest32<256l>, int, std::__1::vector<libtorrent::digest32<256l>, std::__1::allocator<libtorrent::digest32<256l>>>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)::$_32&>()(std::declval<libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>>(), std::declval<libtorrent::digest32<160l> const&>(), std::declval<libtorrent::storage_error const&>())) std::__1::__invoke[abi:v15007]<libtorrent::torrent::on_piece_hashed(libtorrent::aux::container_wrapper<libtorrent::digest32<256l>, int, std::__1::vector<libtorrent::digest32<256l>, std::__1::allocator<libtorrent::digest32<256l>>>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)::$_32&, libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&>(libtorrent::torrent::on_piece_hashed(libtorrent::aux::container_wrapper<libtorrent::digest32<256l>, int, std::__1::vector<libtorrent::digest32<256l>, std::__1::allocator<libtorrent::digest32<256l>>>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)::$_32&, libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>&&, libtorrent::digest32<160l> const&, libtorrent::storage_error const&) (invoke.h:394)
  at 0x5555606e7c0f void std::__1::__invoke_void_return_wrapper<void, true>::__call<libtorrent::torrent::on_piece_hashed(libtorrent::aux::container_wrapper<libtorrent::digest32<256l>, int, std::__1::vector<libtorrent::digest32<256l>, std::__1::allocator<libtorrent::digest32<256l>>>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)::$_32&, libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&>(libtorrent::torrent::on_piece_hashed(libtorrent::aux::container_wrapper<libtorrent::digest32<256l>, int, std::__1::vector<libtorrent::digest32<256l>, std::__1::allocator<libtorrent::digest32<256l>>>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)::$_32&, libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>&&, libtorrent::digest32<160l> const&, libtorrent::storage_error const&) (invoke.h:479)
  at 0x5555606e7b06 std::__1::__function::__alloc_func<libtorrent::torrent::on_piece_hashed(libtorrent::aux::container_wrapper<libtorrent::digest32<256l>, int, std::__1::vector<libtorrent::digest32<256l>, std::__1::allocator<libtorrent::digest32<256l>>>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)::$_32, std::__1::allocator<libtorrent::torrent::on_piece_hashed(libtorrent::aux::container_wrapper<libtorrent::digest32<256l>, int, std::__1::vector<libtorrent::digest32<256l>, std::__1::allocator<libtorrent::digest32<256l>>>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)::$_32>, void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>::operator()[abi:v15007](libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>&&, libtorrent::digest32<160l> const&, libtorrent::storage_error const&) (function.h:185)
  at 0x5555606e435c std::__1::__function::__func<libtorrent::torrent::on_piece_hashed(libtorrent::aux::container_wrapper<libtorrent::digest32<256l>, int, std::__1::vector<libtorrent::digest32<256l>, std::__1::allocator<libtorrent::digest32<256l>>>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)::$_32, std::__1::allocator<libtorrent::torrent::on_piece_hashed(libtorrent::aux::container_wrapper<libtorrent::digest32<256l>, int, std::__1::vector<libtorrent::digest32<256l>, std::__1::allocator<libtorrent::digest32<256l>>>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)::$_32>, void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>::operator()(libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>&&, libtorrent::digest32<160l> const&, libtorrent::storage_error const&) (function.h:359)
  at 0x55555f813c3f std::__1::__function::__value_func<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>::operator()[abi:v15007](libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>&&, libtorrent::digest32<160l> const&, libtorrent::storage_error const&) const (function.h:512)
  at 0x55555f813969 std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>::operator()(libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&) const (function.h:1197)
  at 0x55555f8136f9 libtorrent::aux::(anonymous namespace)::caller_visitor::operator()(std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>&) const (mmap_disk_job.cpp:67)
  at 0x55555f813425 boost::disable_if_c<false && is_same<std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>&, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>&>::value, void>::type boost::detail::variant::invoke_visitor<libtorrent::aux::(anonymous namespace)::caller_visitor const, false>::internal_visit<std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>&>(std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>&, int) (variant.hpp:1028)
  at 0x55555f813352 boost::detail::variant::invoke_visitor<libtorrent::aux::(anonymous namespace)::caller_visitor const, false>::result_type boost::detail::variant::visitation_impl_invoke_impl<boost::detail::variant::invoke_visitor<libtorrent::aux::(anonymous namespace)::caller_visitor const, false>, void*, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>>(int, boost::detail::variant::invoke_visitor<libtorrent::aux::(anonymous namespace)::caller_visitor const, false>&, void*, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>*, mpl_::bool_<true>) (visitation_impl.hpp:117)
  at 0x55555f812381 boost::detail::variant::invoke_visitor<libtorrent::aux::(anonymous namespace)::caller_visitor const, false>::result_type boost::detail::variant::visitation_impl_invoke<boost::detail::variant::invoke_visitor<libtorrent::aux::(anonymous namespace)::caller_visitor const, false>, void*, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>, boost::variant<std::__1::function<void (libtorrent::disk_buffer_holder, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<256l> const&, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::status_t, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::storage_error const&)>, std::__1::function<void ()>, std::__1::function<void (libtorrent::status_t, libtorrent::storage_error const&)>, std::__1::function<void (std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>)>, std::__1::function<void (libtorrent::storage_error const&, libtorrent::aux::container_wrapper<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, std::__1::vector<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, std::__1::allocator<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>>>>)>>::has_fallback_type_>(int, boost::detail::variant::invoke_visitor<libtorrent::aux::(anonymous namespace)::caller_visitor const, false>&, void*, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>*, boost::variant<std::__1::function<void (libtorrent::disk_buffer_holder, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<256l> const&, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::status_t, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::storage_error const&)>, std::__1::function<void ()>, std::__1::function<void (libtorrent::status_t, libtorrent::storage_error const&)>, std::__1::function<void (std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>)>, std::__1::function<void (libtorrent::storage_error const&, libtorrent::aux::container_wrapper<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, std::__1::vector<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, std::__1::allocator<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>>>>)>>::has_fallback_type_, int) (visitation_impl.hpp:157)
  at 0x55555f811b2d boost::detail::variant::invoke_visitor<libtorrent::aux::(anonymous namespace)::caller_visitor const, false>::result_type boost::detail::variant::visitation_impl<mpl_::int_<0>, boost::detail::variant::visitation_impl_step<boost::mpl::l_iter<boost::mpl::l_item<mpl_::long_<10l>, std::__1::function<void (libtorrent::disk_buffer_holder, libtorrent::storage_error const&)>, boost::mpl::l_item<mpl_::long_<9l>, std::__1::function<void (libtorrent::storage_error const&)>, boost::mpl::l_item<mpl_::long_<8l>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>, boost::mpl::l_item<mpl_::long_<7l>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<256l> const&, libtorrent::storage_error const&)>, boost::mpl::l_item<mpl_::long_<6l>, std::__1::function<void (libtorrent::status_t, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::storage_error const&)>, boost::mpl::l_item<mpl_::long_<5l>, std::__1::function<void ()>, boost::mpl::l_item<mpl_::long_<4l>, std::__1::function<void (libtorrent::status_t, libtorrent::storage_error const&)>, boost::mpl::l_item<mpl_::long_<3l>, std::__1::function<void (std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, libtorrent::storage_error const&)>, boost::mpl::l_item<mpl_::long_<2l>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>)>, boost::mpl::l_item<mpl_::long_<1l>, std::__1::function<void (libtorrent::storage_error const&, libtorrent::aux::container_wrapper<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, std::__1::vector<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, std::__1::allocator<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>>>>)>, boost::mpl::l_end>>>>>>>>>>>, boost::mpl::l_iter<boost::mpl::l_end>>, boost::detail::variant::invoke_visitor<libtorrent::aux::(anonymous namespace)::caller_visitor const, false>, void*, boost::variant<std::__1::function<void (libtorrent::disk_buffer_holder, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<256l> const&, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::status_t, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::storage_error const&)>, std::__1::function<void ()>, std::__1::function<void (libtorrent::status_t, libtorrent::storage_error const&)>, std::__1::function<void (std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>)>, std::__1::function<void (libtorrent::storage_error const&, libtorrent::aux::container_wrapper<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, std::__1::vector<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, std::__1::allocator<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>>>>)>>::has_fallback_type_>(int, int, boost::detail::variant::invoke_visitor<libtorrent::aux::(anonymous namespace)::caller_visitor const, false>&, void*, mpl_::bool_<false>, boost::variant<std::__1::function<void (libtorrent::disk_buffer_holder, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<256l> const&, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::status_t, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::storage_error const&)>, std::__1::function<void ()>, std::__1::function<void (libtorrent::status_t, libtorrent::storage_error const&)>, std::__1::function<void (std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>)>, std::__1::function<void (libtorrent::storage_error const&, libtorrent::aux::container_wrapper<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, std::__1::vector<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, std::__1::allocator<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>>>>)>>::has_fallback_type_, mpl_::int_<0>*, boost::detail::variant::visitation_impl_step<boost::mpl::l_iter<boost::mpl::l_item<mpl_::long_<10l>, std::__1::function<void (libtorrent::disk_buffer_holder, libtorrent::storage_error const&)>, boost::mpl::l_item<mpl_::long_<9l>, std::__1::function<void (libtorrent::storage_error const&)>, boost::mpl::l_item<mpl_::long_<8l>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>, boost::mpl::l_item<mpl_::long_<7l>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<256l> const&, libtorrent::storage_error const&)>, boost::mpl::l_item<mpl_::long_<6l>, std::__1::function<void (libtorrent::status_t, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::storage_error const&)>, boost::mpl::l_item<mpl_::long_<5l>, std::__1::function<void ()>, boost::mpl::l_item<mpl_::long_<4l>, std::__1::function<void (libtorrent::status_t, libtorrent::storage_error const&)>, boost::mpl::l_item<mpl_::long_<3l>, std::__1::function<void (std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, libtorrent::storage_error const&)>, boost::mpl::l_item<mpl_::long_<2l>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>)>, boost::mpl::l_item<mpl_::long_<1l>, std::__1::function<void (libtorrent::storage_error const&, libtorrent::aux::container_wrapper<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, std::__1::vector<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, std::__1::allocator<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>>>>)>, boost::mpl::l_end>>>>>>>>>>>, boost::mpl::l_iter<boost::mpl::l_end>>*) (visitation_impl.hpp:238)
  at 0x55555f811b2d boost::detail::variant::invoke_visitor<libtorrent::aux::(anonymous namespace)::caller_visitor const, false>::result_type boost::variant<std::__1::function<void (libtorrent::disk_buffer_holder, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<256l> const&, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::status_t, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::storage_error const&)>, std::__1::function<void ()>, std::__1::function<void (libtorrent::status_t, libtorrent::storage_error const&)>, std::__1::function<void (std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>)>, std::__1::function<void (libtorrent::storage_error const&, libtorrent::aux::container_wrapper<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, std::__1::vector<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, std::__1::allocator<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>>>>)>>::internal_apply_visitor_impl<boost::detail::variant::invoke_visitor<libtorrent::aux::(anonymous namespace)::caller_visitor const, false>, void*>(int, int, boost::detail::variant::invoke_visitor<libtorrent::aux::(anonymous namespace)::caller_visitor const, false>&, void*) (variant.hpp:2338)
  at 0x55555f811b2d boost::detail::variant::invoke_visitor<libtorrent::aux::(anonymous namespace)::caller_visitor const, false>::result_type boost::variant<std::__1::function<void (libtorrent::disk_buffer_holder, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<256l> const&, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::status_t, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::storage_error const&)>, std::__1::function<void ()>, std::__1::function<void (libtorrent::status_t, libtorrent::storage_error const&)>, std::__1::function<void (std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>)>, std::__1::function<void (libtorrent::storage_error const&, libtorrent::aux::container_wrapper<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, std::__1::vector<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, std::__1::allocator<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>>>>)>>::internal_apply_visitor<boost::detail::variant::invoke_visitor<libtorrent::aux::(anonymous namespace)::caller_visitor const, false>>(boost::detail::variant::invoke_visitor<libtorrent::aux::(anonymous namespace)::caller_visitor const, false>&) (variant.hpp:2350)
  at 0x55555f811b2d libtorrent::aux::(anonymous namespace)::caller_visitor const::result_type boost::variant<std::__1::function<void (libtorrent::disk_buffer_holder, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<256l> const&, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::status_t, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::storage_error const&)>, std::__1::function<void ()>, std::__1::function<void (libtorrent::status_t, libtorrent::storage_error const&)>, std::__1::function<void (std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>)>, std::__1::function<void (libtorrent::storage_error const&, libtorrent::aux::container_wrapper<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, std::__1::vector<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, std::__1::allocator<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>>>>)>>::apply_visitor<libtorrent::aux::(anonymous namespace)::caller_visitor const>(libtorrent::aux::(anonymous namespace)::caller_visitor const&) & (variant.hpp:2394)
  at 0x55555f8114cd libtorrent::aux::(anonymous namespace)::caller_visitor::result_type boost::apply_visitor<libtorrent::aux::(anonymous namespace)::caller_visitor, boost::variant<std::__1::function<void (libtorrent::disk_buffer_holder, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<256l> const&, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::status_t, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::storage_error const&)>, std::__1::function<void ()>, std::__1::function<void (libtorrent::status_t, libtorrent::storage_error const&)>, std::__1::function<void (std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>)>, std::__1::function<void (libtorrent::storage_error const&, libtorrent::aux::container_wrapper<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, std::__1::vector<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, std::__1::allocator<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>>>>)>>&>(libtorrent::aux::(anonymous namespace)::caller_visitor const&, boost::variant<std::__1::function<void (libtorrent::disk_buffer_holder, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<256l> const&, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::status_t, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::storage_error const&)>, std::__1::function<void ()>, std::__1::function<void (libtorrent::status_t, libtorrent::storage_error const&)>, std::__1::function<void (std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>)>, std::__1::function<void (libtorrent::storage_error const&, libtorrent::aux::container_wrapper<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, std::__1::vector<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, std::__1::allocator<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>>>>)>>&) (apply_visitor_unary.hpp:68)
Previously allocated by thread T1 here:
  at 0x55555e86910d operator new(unsigned long)
  at 0x55555e86e22c void* std::__1::__libcpp_operator_new[abi:v15007]<unsigned long>(unsigned long) (new:246)
  at 0x55555e86e200 std::__1::__libcpp_allocate[abi:v15007](unsigned long, unsigned long) (new:272)
  at 0x55555f4848b7 std::__1::allocator<libtorrent::digest32<256l>>::allocate[abi:v15007](unsigned long) (allocator.h:112)
  at 0x55555f48479f std::__1::allocator<libtorrent::digest32<256l>>::allocate_at_least[abi:v15007](unsigned long) (allocator.h:119)
  at 0x55555f484644 std::__1::allocation_result<std::__1::allocator_traits<std::__1::allocator<libtorrent::digest32<256l>>>::pointer> std::__1::allocate_at_least[abi:v15007]<std::__1::allocator<libtorrent::digest32<256l>>>(std::__1::allocator<libtorrent::digest32<256l>>&, unsigned long) (allocate_at_least.h:33)
  at 0x55555f484338 auto std::__1::__allocate_at_least[abi:v15007]<std::__1::allocator<libtorrent::digest32<256l>>>(std::__1::allocator<libtorrent::digest32<256l>>&, unsigned long) (allocate_at_least.h:42)
  at 0x55555f4c282e std::__1::vector<libtorrent::digest32<256l>, std::__1::allocator<libtorrent::digest32<256l>>>::__vallocate[abi:v15007](unsigned long) (vector:692)
  at 0x55555f4c2376 std::__1::vector<libtorrent::digest32<256l>, std::__1::allocator<libtorrent::digest32<256l>>>::vector(std::__1::vector<libtorrent::digest32<256l>, std::__1::allocator<libtorrent::digest32<256l>>> const&) (vector:1215)
  at 0x55555f58abbf libtorrent::aux::container_wrapper<libtorrent::digest32<256l>, int, std::__1::vector<libtorrent::digest32<256l>, std::__1::allocator<libtorrent::digest32<256l>>>>::container_wrapper(libtorrent::aux::container_wrapper<libtorrent::digest32<256l>, int, std::__1::vector<libtorrent::digest32<256l>, std::__1::allocator<libtorrent::digest32<256l>>>> const&) (container_wrapper.hpp:48)
  at 0x5555606e8125 libtorrent::torrent::on_piece_hashed(libtorrent::aux::container_wrapper<libtorrent::digest32<256l>, int, std::__1::vector<libtorrent::digest32<256l>, std::__1::allocator<libtorrent::digest32<256l>>>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)::$_32::operator()(libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&) const (torrent.cpp:2579)
  at 0x5555606e7e6a decltype(std::declval<libtorrent::torrent::on_piece_hashed(libtorrent::aux::container_wrapper<libtorrent::digest32<256l>, int, std::__1::vector<libtorrent::digest32<256l>, std::__1::allocator<libtorrent::digest32<256l>>>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)::$_32&>()(std::declval<libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>>(), std::declval<libtorrent::digest32<160l> const&>(), std::declval<libtorrent::storage_error const&>())) std::__1::__invoke[abi:v15007]<libtorrent::torrent::on_piece_hashed(libtorrent::aux::container_wrapper<libtorrent::digest32<256l>, int, std::__1::vector<libtorrent::digest32<256l>, std::__1::allocator<libtorrent::digest32<256l>>>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)::$_32&, libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&>(libtorrent::torrent::on_piece_hashed(libtorrent::aux::container_wrapper<libtorrent::digest32<256l>, int, std::__1::vector<libtorrent::digest32<256l>, std::__1::allocator<libtorrent::digest32<256l>>>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)::$_32&, libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>&&, libtorrent::digest32<160l> const&, libtorrent::storage_error const&) (invoke.h:394)
  at 0x5555606e7c0f void std::__1::__invoke_void_return_wrapper<void, true>::__call<libtorrent::torrent::on_piece_hashed(libtorrent::aux::container_wrapper<libtorrent::digest32<256l>, int, std::__1::vector<libtorrent::digest32<256l>, std::__1::allocator<libtorrent::digest32<256l>>>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)::$_32&, libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&>(libtorrent::torrent::on_piece_hashed(libtorrent::aux::container_wrapper<libtorrent::digest32<256l>, int, std::__1::vector<libtorrent::digest32<256l>, std::__1::allocator<libtorrent::digest32<256l>>>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)::$_32&, libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>&&, libtorrent::digest32<160l> const&, libtorrent::storage_error const&) (invoke.h:479)
  at 0x5555606e7b06 std::__1::__function::__alloc_func<libtorrent::torrent::on_piece_hashed(libtorrent::aux::container_wrapper<libtorrent::digest32<256l>, int, std::__1::vector<libtorrent::digest32<256l>, std::__1::allocator<libtorrent::digest32<256l>>>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)::$_32, std::__1::allocator<libtorrent::torrent::on_piece_hashed(libtorrent::aux::container_wrapper<libtorrent::digest32<256l>, int, std::__1::vector<libtorrent::digest32<256l>, std::__1::allocator<libtorrent::digest32<256l>>>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)::$_32>, void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>::operator()[abi:v15007](libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>&&, libtorrent::digest32<160l> const&, libtorrent::storage_error const&) (function.h:185)
  at 0x5555606e435c std::__1::__function::__func<libtorrent::torrent::on_piece_hashed(libtorrent::aux::container_wrapper<libtorrent::digest32<256l>, int, std::__1::vector<libtorrent::digest32<256l>, std::__1::allocator<libtorrent::digest32<256l>>>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)::$_32, std::__1::allocator<libtorrent::torrent::on_piece_hashed(libtorrent::aux::container_wrapper<libtorrent::digest32<256l>, int, std::__1::vector<libtorrent::digest32<256l>, std::__1::allocator<libtorrent::digest32<256l>>>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)::$_32>, void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>::operator()(libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>&&, libtorrent::digest32<160l> const&, libtorrent::storage_error const&) (function.h:359)
  at 0x55555f813c3f std::__1::__function::__value_func<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>::operator()[abi:v15007](libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>&&, libtorrent::digest32<160l> const&, libtorrent::storage_error const&) const (function.h:512)
  at 0x55555f813969 std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>::operator()(libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&) const (function.h:1197)
  at 0x55555f8136f9 libtorrent::aux::(anonymous namespace)::caller_visitor::operator()(std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>&) const (mmap_disk_job.cpp:67)
  at 0x55555f813425 boost::disable_if_c<false && is_same<std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>&, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>&>::value, void>::type boost::detail::variant::invoke_visitor<libtorrent::aux::(anonymous namespace)::caller_visitor const, false>::internal_visit<std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>&>(std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>&, int) (variant.hpp:1028)
  at 0x55555f813352 boost::detail::variant::invoke_visitor<libtorrent::aux::(anonymous namespace)::caller_visitor const, false>::result_type boost::detail::variant::visitation_impl_invoke_impl<boost::detail::variant::invoke_visitor<libtorrent::aux::(anonymous namespace)::caller_visitor const, false>, void*, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>>(int, boost::detail::variant::invoke_visitor<libtorrent::aux::(anonymous namespace)::caller_visitor const, false>&, void*, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>*, mpl_::bool_<true>) (visitation_impl.hpp:117)
  at 0x55555f812381 boost::detail::variant::invoke_visitor<libtorrent::aux::(anonymous namespace)::caller_visitor const, false>::result_type boost::detail::variant::visitation_impl_invoke<boost::detail::variant::invoke_visitor<libtorrent::aux::(anonymous namespace)::caller_visitor const, false>, void*, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>, boost::variant<std::__1::function<void (libtorrent::disk_buffer_holder, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<256l> const&, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::status_t, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::storage_error const&)>, std::__1::function<void ()>, std::__1::function<void (libtorrent::status_t, libtorrent::storage_error const&)>, std::__1::function<void (std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>)>, std::__1::function<void (libtorrent::storage_error const&, libtorrent::aux::container_wrapper<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, std::__1::vector<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, std::__1::allocator<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>>>>)>>::has_fallback_type_>(int, boost::detail::variant::invoke_visitor<libtorrent::aux::(anonymous namespace)::caller_visitor const, false>&, void*, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>*, boost::variant<std::__1::function<void (libtorrent::disk_buffer_holder, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<256l> const&, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::status_t, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::storage_error const&)>, std::__1::function<void ()>, std::__1::function<void (libtorrent::status_t, libtorrent::storage_error const&)>, std::__1::function<void (std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>)>, std::__1::function<void (libtorrent::storage_error const&, libtorrent::aux::container_wrapper<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, std::__1::vector<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, std::__1::allocator<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>>>>)>>::has_fallback_type_, int) (visitation_impl.hpp:157)
  at 0x55555f811b2d boost::detail::variant::invoke_visitor<libtorrent::aux::(anonymous namespace)::caller_visitor const, false>::result_type boost::detail::variant::visitation_impl<mpl_::int_<0>, boost::detail::variant::visitation_impl_step<boost::mpl::l_iter<boost::mpl::l_item<mpl_::long_<10l>, std::__1::function<void (libtorrent::disk_buffer_holder, libtorrent::storage_error const&)>, boost::mpl::l_item<mpl_::long_<9l>, std::__1::function<void (libtorrent::storage_error const&)>, boost::mpl::l_item<mpl_::long_<8l>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>, boost::mpl::l_item<mpl_::long_<7l>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<256l> const&, libtorrent::storage_error const&)>, boost::mpl::l_item<mpl_::long_<6l>, std::__1::function<void (libtorrent::status_t, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::storage_error const&)>, boost::mpl::l_item<mpl_::long_<5l>, std::__1::function<void ()>, boost::mpl::l_item<mpl_::long_<4l>, std::__1::function<void (libtorrent::status_t, libtorrent::storage_error const&)>, boost::mpl::l_item<mpl_::long_<3l>, std::__1::function<void (std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, libtorrent::storage_error const&)>, boost::mpl::l_item<mpl_::long_<2l>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>)>, boost::mpl::l_item<mpl_::long_<1l>, std::__1::function<void (libtorrent::storage_error const&, libtorrent::aux::container_wrapper<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, std::__1::vector<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, std::__1::allocator<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>>>>)>, boost::mpl::l_end>>>>>>>>>>>, boost::mpl::l_iter<boost::mpl::l_end>>, boost::detail::variant::invoke_visitor<libtorrent::aux::(anonymous namespace)::caller_visitor const, false>, void*, boost::variant<std::__1::function<void (libtorrent::disk_buffer_holder, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<256l> const&, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::status_t, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::storage_error const&)>, std::__1::function<void ()>, std::__1::function<void (libtorrent::status_t, libtorrent::storage_error const&)>, std::__1::function<void (std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>)>, std::__1::function<void (libtorrent::storage_error const&, libtorrent::aux::container_wrapper<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, std::__1::vector<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, std::__1::allocator<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>>>>)>>::has_fallback_type_>(int, int, boost::detail::variant::invoke_visitor<libtorrent::aux::(anonymous namespace)::caller_visitor const, false>&, void*, mpl_::bool_<false>, boost::variant<std::__1::function<void (libtorrent::disk_buffer_holder, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<256l> const&, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::status_t, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::storage_error const&)>, std::__1::function<void ()>, std::__1::function<void (libtorrent::status_t, libtorrent::storage_error const&)>, std::__1::function<void (std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>)>, std::__1::function<void (libtorrent::storage_error const&, libtorrent::aux::container_wrapper<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, std::__1::vector<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, std::__1::allocator<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>>>>)>>::has_fallback_type_, mpl_::int_<0>*, boost::detail::variant::visitation_impl_step<boost::mpl::l_iter<boost::mpl::l_item<mpl_::long_<10l>, std::__1::function<void (libtorrent::disk_buffer_holder, libtorrent::storage_error const&)>, boost::mpl::l_item<mpl_::long_<9l>, std::__1::function<void (libtorrent::storage_error const&)>, boost::mpl::l_item<mpl_::long_<8l>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>, boost::mpl::l_item<mpl_::long_<7l>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<256l> const&, libtorrent::storage_error const&)>, boost::mpl::l_item<mpl_::long_<6l>, std::__1::function<void (libtorrent::status_t, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::storage_error const&)>, boost::mpl::l_item<mpl_::long_<5l>, std::__1::function<void ()>, boost::mpl::l_item<mpl_::long_<4l>, std::__1::function<void (libtorrent::status_t, libtorrent::storage_error const&)>, boost::mpl::l_item<mpl_::long_<3l>, std::__1::function<void (std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, libtorrent::storage_error const&)>, boost::mpl::l_item<mpl_::long_<2l>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>)>, boost::mpl::l_item<mpl_::long_<1l>, std::__1::function<void (libtorrent::storage_error const&, libtorrent::aux::container_wrapper<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, std::__1::vector<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, std::__1::allocator<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>>>>)>, boost::mpl::l_end>>>>>>>>>>>, boost::mpl::l_iter<boost::mpl::l_end>>*) (visitation_impl.hpp:238)
  at 0x55555f811b2d boost::detail::variant::invoke_visitor<libtorrent::aux::(anonymous namespace)::caller_visitor const, false>::result_type boost::variant<std::__1::function<void (libtorrent::disk_buffer_holder, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<256l> const&, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::status_t, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::storage_error const&)>, std::__1::function<void ()>, std::__1::function<void (libtorrent::status_t, libtorrent::storage_error const&)>, std::__1::function<void (std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>)>, std::__1::function<void (libtorrent::storage_error const&, libtorrent::aux::container_wrapper<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, std::__1::vector<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, std::__1::allocator<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>>>>)>>::internal_apply_visitor_impl<boost::detail::variant::invoke_visitor<libtorrent::aux::(anonymous namespace)::caller_visitor const, false>, void*>(int, int, boost::detail::variant::invoke_visitor<libtorrent::aux::(anonymous namespace)::caller_visitor const, false>&, void*) (variant.hpp:2338)
  at 0x55555f811b2d boost::detail::variant::invoke_visitor<libtorrent::aux::(anonymous namespace)::caller_visitor const, false>::result_type boost::variant<std::__1::function<void (libtorrent::disk_buffer_holder, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<256l> const&, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::status_t, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::storage_error const&)>, std::__1::function<void ()>, std::__1::function<void (libtorrent::status_t, libtorrent::storage_error const&)>, std::__1::function<void (std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>)>, std::__1::function<void (libtorrent::storage_error const&, libtorrent::aux::container_wrapper<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, std::__1::vector<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, std::__1::allocator<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>>>>)>>::internal_apply_visitor<boost::detail::variant::invoke_visitor<libtorrent::aux::(anonymous namespace)::caller_visitor const, false>>(boost::detail::variant::invoke_visitor<libtorrent::aux::(anonymous namespace)::caller_visitor const, false>&) (variant.hpp:2350)
  at 0x55555f811b2d libtorrent::aux::(anonymous namespace)::caller_visitor const::result_type boost::variant<std::__1::function<void (libtorrent::disk_buffer_holder, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<256l> const&, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::status_t, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::storage_error const&)>, std::__1::function<void ()>, std::__1::function<void (libtorrent::status_t, libtorrent::storage_error const&)>, std::__1::function<void (std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>)>, std::__1::function<void (libtorrent::storage_error const&, libtorrent::aux::container_wrapper<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, std::__1::vector<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, std::__1::allocator<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>>>>)>>::apply_visitor<libtorrent::aux::(anonymous namespace)::caller_visitor const>(libtorrent::aux::(anonymous namespace)::caller_visitor const&) & (variant.hpp:2394)
  at 0x55555f8114cd libtorrent::aux::(anonymous namespace)::caller_visitor::result_type boost::apply_visitor<libtorrent::aux::(anonymous namespace)::caller_visitor, boost::variant<std::__1::function<void (libtorrent::disk_buffer_holder, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<256l> const&, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::status_t, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::storage_error const&)>, std::__1::function<void ()>, std::__1::function<void (libtorrent::status_t, libtorrent::storage_error const&)>, std::__1::function<void (std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>)>, std::__1::function<void (libtorrent::storage_error const&, libtorrent::aux::container_wrapper<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, std::__1::vector<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, std::__1::allocator<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>>>>)>>&>(libtorrent::aux::(anonymous namespace)::caller_visitor const&, boost::variant<std::__1::function<void (libtorrent::disk_buffer_holder, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<256l> const&, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::status_t, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::storage_error const&)>, std::__1::function<void ()>, std::__1::function<void (libtorrent::status_t, libtorrent::storage_error const&)>, std::__1::function<void (std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>)>, std::__1::function<void (libtorrent::storage_error const&, libtorrent::aux::container_wrapper<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, std::__1::vector<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, std::__1::allocator<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>>>>)>>&) (apply_visitor_unary.hpp:68)
  at 0x55555f8113aa libtorrent::aux::mmap_disk_job::call_callback() (mmap_disk_job.cpp:133)
  at 0x55555f73bebd libtorrent::mmap_disk_io::call_job_handlers() (mmap_disk_io.cpp:1803)
  at 0x55555f7626d0 libtorrent::mmap_disk_io::add_completed_jobs_impl(libtorrent::tailqueue<libtorrent::aux::mmap_disk_job>, libtorrent::tailqueue<libtorrent::aux::mmap_disk_job>&)::$_1::operator()() const (mmap_disk_io.cpp:1771)
  at 0x55555f7625f9 boost::asio::detail::binder0<libtorrent::mmap_disk_io::add_completed_jobs_impl(libtorrent::tailqueue<libtorrent::aux::mmap_disk_job>, libtorrent::tailqueue<libtorrent::aux::mmap_disk_job>&)::$_1>::operator()() (bind_handler.hpp:60)
  at 0x55555f76230e void boost_asio_handler_invoke_helpers::invoke<boost::asio::detail::binder0<libtorrent::mmap_disk_io::add_completed_jobs_impl(libtorrent::tailqueue<libtorrent::aux::mmap_disk_job>, libtorrent::tailqueue<libtorrent::aux::mmap_disk_job>&)::$_1>, boost::asio::detail::binder0<libtorrent::mmap_disk_io::add_completed_jobs_impl(libtorrent::tailqueue<libtorrent::aux::mmap_disk_job>, libtorrent::tailqueue<libtorrent::aux::mmap_disk_job>&)::$_1>>(boost::asio::detail::binder0<libtorrent::mmap_disk_io::add_completed_jobs_impl(libtorrent::tailqueue<libtorrent::aux::mmap_disk_job>, libtorrent::tailqueue<libtorrent::aux::mmap_disk_job>&)::$_1>&, boost::asio::detail::binder0<libtorrent::mmap_disk_io::add_completed_jobs_impl(libtorrent::tailqueue<libtorrent::aux::mmap_disk_job>, libtorrent::tailqueue<libtorrent::aux::mmap_disk_job>&)::$_1>&) (handler_invoke_helpers.hpp:51)
  at 0x55555f7629bf boost::asio::detail::executor_op<boost::asio::detail::binder0<libtorrent::mmap_disk_io::add_completed_jobs_impl(libtorrent::tailqueue<libtorrent::aux::mmap_disk_job>, libtorrent::tailqueue<libtorrent::aux::mmap_disk_job>&)::$_1>, std::__1::allocator<void>, boost::asio::detail::scheduler_operation>::do_complete(void*, boost::asio::detail::scheduler_operation*, boost::system::error_code const&, unsigned long) (executor_op.hpp:70)
  at 0x55555e8e1ec4 boost::asio::detail::scheduler_operation::complete(void*, boost::system::error_code const&, unsigned long) (scheduler_operation.hpp:40)
Thread T30 created by T1 here:
  at 0x55555e817c3c pthread_create
  at 0x55555ebf4e6b std::__1::__libcpp_thread_create[abi:v15007](unsigned long*, void* (*)(void*), void*) (__threading_support:376)
  at 0x55555f821cdb std::__1::thread::thread<void (libtorrent::aux::pool_thread_interface::*)(libtorrent::aux::disk_io_thread_pool&, boost::asio::executor_work_guard<boost::asio::io_context::basic_executor_type<std::__1::allocator<void>, 0ul>, void, void>), libtorrent::aux::pool_thread_interface*, std::__1::reference_wrapper<libtorrent::aux::disk_io_thread_pool>, boost::asio::executor_work_guard<boost::asio::io_context::basic_executor_type<std::__1::allocator<void>, 0ul>, void, void>, void>(void (libtorrent::aux::pool_thread_interface::*&&)(libtorrent::aux::disk_io_thread_pool&, boost::asio::executor_work_guard<boost::asio::io_context::basic_executor_type<std::__1::allocator<void>, 0ul>, void, void>), libtorrent::aux::pool_thread_interface*&&, std::__1::reference_wrapper<libtorrent::aux::disk_io_thread_pool>&&, boost::asio::executor_work_guard<boost::asio::io_context::basic_executor_type<std::__1::allocator<void>, 0ul>, void, void>&&) (thread:311)
  at 0x55555f821a28 std::__1::thread* std::__1::construct_at[abi:v15007]<std::__1::thread, void (libtorrent::aux::pool_thread_interface::*)(libtorrent::aux::disk_io_thread_pool&, boost::asio::executor_work_guard<boost::asio::io_context::basic_executor_type<std::__1::allocator<void>, 0ul>, void, void>), libtorrent::aux::pool_thread_interface*, std::__1::reference_wrapper<libtorrent::aux::disk_io_thread_pool>, boost::asio::executor_work_guard<boost::asio::io_context::basic_executor_type<std::__1::allocator<void>, 0ul>, void, void>, std::__1::thread*>(std::__1::thread*, void (libtorrent::aux::pool_thread_interface::*&&)(libtorrent::aux::disk_io_thread_pool&, boost::asio::executor_work_guard<boost::asio::io_context::basic_executor_type<std::__1::allocator<void>, 0ul>, void, void>), libtorrent::aux::pool_thread_interface*&&, std::__1::reference_wrapper<libtorrent::aux::disk_io_thread_pool>&&, boost::asio::executor_work_guard<boost::asio::io_context::basic_executor_type<std::__1::allocator<void>, 0ul>, void, void>&&) (construct_at.h:35)
  at 0x55555f8218c0 void std::__1::allocator_traits<std::__1::allocator<std::__1::thread>>::construct[abi:v15007]<std::__1::thread, void (libtorrent::aux::pool_thread_interface::*)(libtorrent::aux::disk_io_thread_pool&, boost::asio::executor_work_guard<boost::asio::io_context::basic_executor_type<std::__1::allocator<void>, 0ul>, void, void>), libtorrent::aux::pool_thread_interface*, std::__1::reference_wrapper<libtorrent::aux::disk_io_thread_pool>, boost::asio::executor_work_guard<boost::asio::io_context::basic_executor_type<std::__1::allocator<void>, 0ul>, void, void>, void, void>(std::__1::allocator<std::__1::thread>&, std::__1::thread*, void (libtorrent::aux::pool_thread_interface::*&&)(libtorrent::aux::disk_io_thread_pool&, boost::asio::executor_work_guard<boost::asio::io_context::basic_executor_type<std::__1::allocator<void>, 0ul>, void, void>), libtorrent::aux::pool_thread_interface*&&, std::__1::reference_wrapper<libtorrent::aux::disk_io_thread_pool>&&, boost::asio::executor_work_guard<boost::asio::io_context::basic_executor_type<std::__1::allocator<void>, 0ul>, void, void>&&) (allocator_traits.h:298)
  at 0x55555f821650 void std::__1::vector<std::__1::thread, std::__1::allocator<std::__1::thread>>::__emplace_back_slow_path<void (libtorrent::aux::pool_thread_interface::*)(libtorrent::aux::disk_io_thread_pool&, boost::asio::executor_work_guard<boost::asio::io_context::basic_executor_type<std::__1::allocator<void>, 0ul>, void, void>), libtorrent::aux::pool_thread_interface*, std::__1::reference_wrapper<libtorrent::aux::disk_io_thread_pool>, boost::asio::executor_work_guard<boost::asio::io_context::basic_executor_type<std::__1::allocator<void>, 0ul>, void, void>>(void (libtorrent::aux::pool_thread_interface::*&&)(libtorrent::aux::disk_io_thread_pool&, boost::asio::executor_work_guard<boost::asio::io_context::basic_executor_type<std::__1::allocator<void>, 0ul>, void, void>), libtorrent::aux::pool_thread_interface*&&, std::__1::reference_wrapper<libtorrent::aux::disk_io_thread_pool>&&, boost::asio::executor_work_guard<boost::asio::io_context::basic_executor_type<std::__1::allocator<void>, 0ul>, void, void>&&) (vector:1613)
  at 0x55555f81ae84 std::__1::thread& std::__1::vector<std::__1::thread, std::__1::allocator<std::__1::thread>>::emplace_back<void (libtorrent::aux::pool_thread_interface::*)(libtorrent::aux::disk_io_thread_pool&, boost::asio::executor_work_guard<boost::asio::io_context::basic_executor_type<std::__1::allocator<void>, 0ul>, void, void>), libtorrent::aux::pool_thread_interface*, std::__1::reference_wrapper<libtorrent::aux::disk_io_thread_pool>, boost::asio::executor_work_guard<boost::asio::io_context::basic_executor_type<std::__1::allocator<void>, 0ul>, void, void>>(void (libtorrent::aux::pool_thread_interface::*&&)(libtorrent::aux::disk_io_thread_pool&, boost::asio::executor_work_guard<boost::asio::io_context::basic_executor_type<std::__1::allocator<void>, 0ul>, void, void>), libtorrent::aux::pool_thread_interface*&&, std::__1::reference_wrapper<libtorrent::aux::disk_io_thread_pool>&&, boost::asio::executor_work_guard<boost::asio::io_context::basic_executor_type<std::__1::allocator<void>, 0ul>, void, void>&&) (vector:1634)
  at 0x55555f81a5ad libtorrent::aux::disk_io_thread_pool::job_queued(int) (disk_io_thread_pool.cpp:178)
  at 0x55555f714614 libtorrent::mmap_disk_io::submit_jobs() (mmap_disk_io.cpp:1441)
  at 0x55555f8fcec7 libtorrent::aux::session_impl::submit_disk_jobs() (session_impl.cpp:1413)
  at 0x55555f9d70cb void libtorrent::aux::session_impl::wrap<void (libtorrent::aux::session_impl::*)()>(void (libtorrent::aux::session_impl::*)()) (session_impl.cpp:578)
  at 0x55555f9f0991 libtorrent::aux::session_impl::deferred_submit_jobs()::$_9::operator()() const (session_impl.cpp:1405)
  at 0x55555f9f01d5 void libtorrent::aux::allocating_handler<libtorrent::aux::session_impl::deferred_submit_jobs()::$_9, 72ul, (libtorrent::aux::HandlerName)7>::operator()<>() (allocating_handler.hpp:268)
  at 0x55555f9f00a9 boost::asio::detail::binder0<libtorrent::aux::allocating_handler<libtorrent::aux::session_impl::deferred_submit_jobs()::$_9, 72ul, (libtorrent::aux::HandlerName)7>>::operator()() (bind_handler.hpp:60)
  at 0x55555f9efd4e void boost_asio_handler_invoke_helpers::invoke<boost::asio::detail::binder0<libtorrent::aux::allocating_handler<libtorrent::aux::session_impl::deferred_submit_jobs()::$_9, 72ul, (libtorrent::aux::HandlerName)7>>, boost::asio::detail::binder0<libtorrent::aux::allocating_handler<libtorrent::aux::session_impl::deferred_submit_jobs()::$_9, 72ul, (libtorrent::aux::HandlerName)7>>>(boost::asio::detail::binder0<libtorrent::aux::allocating_handler<libtorrent::aux::session_impl::deferred_submit_jobs()::$_9, 72ul, (libtorrent::aux::HandlerName)7>>&, boost::asio::detail::binder0<libtorrent::aux::allocating_handler<libtorrent::aux::session_impl::deferred_submit_jobs()::$_9, 72ul, (libtorrent::aux::HandlerName)7>>&) (handler_invoke_helpers.hpp:51)
  at 0x55555f9f1515 boost::asio::detail::executor_op<boost::asio::detail::binder0<libtorrent::aux::allocating_handler<libtorrent::aux::session_impl::deferred_submit_jobs()::$_9, 72ul, (libtorrent::aux::HandlerName)7>>, libtorrent::aux::handler_allocator<int, 72ul, (libtorrent::aux::HandlerName)7>, boost::asio::detail::scheduler_operation>::do_complete(void*, boost::asio::detail::scheduler_operation*, boost::system::error_code const&, unsigned long) (executor_op.hpp:70)
  at 0x55555e8e1ec4 boost::asio::detail::scheduler_operation::complete(void*, boost::system::error_code const&, unsigned long) (scheduler_operation.hpp:40)
  at 0x55555e9d5495 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:492)
  at 0x55555e9d4295 boost::asio::detail::scheduler::run(boost::system::error_code&) (scheduler.ipp:210)
  at 0x55555ebf6631 boost::asio::io_context::run() (io_context.ipp:63)
  at 0x55555f6c824a libtorrent::session::start(libtorrent::flags::bitfield_flag<unsigned char, libtorrent::session_flags_tag, void>, libtorrent::session_params&&, boost::asio::io_context*)::$_0::operator()() const (session.cpp:344)
  at 0x55555f6c80f7 decltype(std::declval<libtorrent::session::start(libtorrent::flags::bitfield_flag<unsigned char, libtorrent::session_flags_tag, void>, libtorrent::session_params&&, boost::asio::io_context*)::$_0>()()) std::__1::__invoke[abi:v15007]<libtorrent::session::start(libtorrent::flags::bitfield_flag<unsigned char, libtorrent::session_flags_tag, void>, libtorrent::session_params&&, boost::asio::io_context*)::$_0>(libtorrent::session::start(libtorrent::flags::bitfield_flag<unsigned char, libtorrent::session_flags_tag, void>, libtorrent::session_params&&, boost::asio::io_context*)::$_0&&) (invoke.h:394)
  at 0x55555f6c809f void std::__1::__thread_execute[abi:v15007]<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, libtorrent::session::start(libtorrent::flags::bitfield_flag<unsigned char, libtorrent::session_flags_tag, void>, libtorrent::session_params&&, boost::asio::io_context*)::$_0>(std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, libtorrent::session::start(libtorrent::flags::bitfield_flag<unsigned char, libtorrent::session_flags_tag, void>, libtorrent::session_params&&, boost::asio::io_context*)::$_0>&, std::__1::__tuple_indices<>) (thread:284)
  at 0x55555f6c786f void* std::__1::__thread_proxy[abi:v15007]<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, libtorrent::session::start(libtorrent::flags::bitfield_flag<unsigned char, libtorrent::session_flags_tag, void>, libtorrent::session_params&&, boost::asio::io_context*)::$_0>>(void*) (thread:295)
  at 0x7ffff75a3fd3 start_thread (pthread_create.c:442)
Thread T1 created by T0 here:
  at 0x55555e817c3c pthread_create
  at 0x55555ebf4e6b std::__1::__libcpp_thread_create[abi:v15007](unsigned long*, void* (*)(void*), void*) (__threading_support:376)
  at 0x55555f6c7336 std::__1::thread::thread<libtorrent::session::start(libtorrent::flags::bitfield_flag<unsigned char, libtorrent::session_flags_tag, void>, libtorrent::session_params&&, boost::asio::io_context*)::$_0, void>(libtorrent::session::start(libtorrent::flags::bitfield_flag<unsigned char, libtorrent::session_flags_tag, void>, libtorrent::session_params&&, boost::asio::io_context*)::$_0&&) (thread:311)
  at 0x55555f6c7143 std::__1::thread* std::__1::construct_at[abi:v15007]<std::__1::thread, libtorrent::session::start(libtorrent::flags::bitfield_flag<unsigned char, libtorrent::session_flags_tag, void>, libtorrent::session_params&&, boost::asio::io_context*)::$_0, std::__1::thread*>(std::__1::thread*, libtorrent::session::start(libtorrent::flags::bitfield_flag<unsigned char, libtorrent::session_flags_tag, void>, libtorrent::session_params&&, boost::asio::io_context*)::$_0&&) (construct_at.h:35)
  at 0x55555f6c69cb void std::__1::allocator_traits<std::__1::allocator<std::__1::thread>>::construct[abi:v15007]<std::__1::thread, libtorrent::session::start(libtorrent::flags::bitfield_flag<unsigned char, libtorrent::session_flags_tag, void>, libtorrent::session_params&&, boost::asio::io_context*)::$_0, void, void>(std::__1::allocator<std::__1::thread>&, std::__1::thread*, libtorrent::session::start(libtorrent::flags::bitfield_flag<unsigned char, libtorrent::session_flags_tag, void>, libtorrent::session_params&&, boost::asio::io_context*)::$_0&&) (allocator_traits.h:298)
  at 0x55555f6c6203 std::__1::__shared_ptr_emplace<std::__1::thread, std::__1::allocator<std::__1::thread>>::__shared_ptr_emplace[abi:v15007]<libtorrent::session::start(libtorrent::flags::bitfield_flag<unsigned char, libtorrent::session_flags_tag, void>, libtorrent::session_params&&, boost::asio::io_context*)::$_0>(std::__1::allocator<std::__1::thread>, libtorrent::session::start(libtorrent::flags::bitfield_flag<unsigned char, libtorrent::session_flags_tag, void>, libtorrent::session_params&&, boost::asio::io_context*)::$_0&&) (shared_ptr.h:292)
  at 0x55555f6c5baf std::__1::shared_ptr<std::__1::thread> std::__1::allocate_shared[abi:v15007]<std::__1::thread, std::__1::allocator<std::__1::thread>, libtorrent::session::start(libtorrent::flags::bitfield_flag<unsigned char, libtorrent::session_flags_tag, void>, libtorrent::session_params&&, boost::asio::io_context*)::$_0, void>(std::__1::allocator<std::__1::thread> const&, libtorrent::session::start(libtorrent::flags::bitfield_flag<unsigned char, libtorrent::session_flags_tag, void>, libtorrent::session_params&&, boost::asio::io_context*)::$_0&&) (shared_ptr.h:953)
  at 0x55555f6b03c8 std::__1::shared_ptr<std::__1::thread> std::__1::make_shared[abi:v15007]<std::__1::thread, libtorrent::session::start(libtorrent::flags::bitfield_flag<unsigned char, libtorrent::session_flags_tag, void>, libtorrent::session_params&&, boost::asio::io_context*)::$_0, void>(libtorrent::session::start(libtorrent::flags::bitfield_flag<unsigned char, libtorrent::session_flags_tag, void>, libtorrent::session_params&&, boost::asio::io_context*)::$_0&&) (shared_ptr.h:962)
  at 0x55555f6ae109 libtorrent::session::start(libtorrent::flags::bitfield_flag<unsigned char, libtorrent::session_flags_tag, void>, libtorrent::session_params&&, boost::asio::io_context*) (session.cpp:341)
  at 0x55555f6b1598 libtorrent::session::session(libtorrent::session_params&&, libtorrent::flags::bitfield_flag<unsigned char, libtorrent::session_flags_tag, void>) (session.cpp:384)
  at 0x55555eb67a38 rf::entrypoint::entrypoint(rf::models::settings::environment const&) (entrypoint.h:35)
  at 0x55555ee32355 main (main.cpp:22)
  at 0x7ffff7542189 __libc_start_call_main (libc_start_call_main.h:58)

And I'm getting either SIGSEGV or SIGABRT (sometimes one, sometimes another) with the following stacktrace in optimized release build: Console output: malloc(): unsorted double linked list corrupted Stacktrace:

__pthread_kill_implementation 0x00007f30c54c6ccc
__GI_raise 0x00007f30c5477ef2
__GI_abort 0x00007f30c5462472
__libc_message 0x00007f30c54bb2d0
malloc_printerr 0x00007f30c54d064a
_int_malloc 0x00007f30c54d392c
__GI___libc_malloc 0x00007f30c54d4799
operator new(unsigned long) 0x00007f30c5d12578
[Inlined] std::__libcpp_operator_new[abi:v15007]<…>(unsigned long) new:246
[Inlined] std::__libcpp_allocate[abi:v15007](unsigned long, unsigned long) new:272
[Inlined] std::allocator::allocate[abi:v15007](unsigned long) allocator.h:112
[Inlined] std::allocator::allocate_at_least[abi:v15007](unsigned long) allocator.h:119
[Inlined] std::allocate_at_least[abi:v15007]<…>(std::allocator<…> &, unsigned long) allocate_at_least.h:33
[Inlined] std::__allocate_at_least[abi:v15007]<…>(std::allocator<…> &, unsigned long) allocate_at_least.h:42
[Inlined] std::vector::__vallocate[abi:v15007](unsigned long) vector:692
[Inlined] std::vector::vector(const std::vector<…> &) vector:1215
[Inlined] libtorrent::aux::container_wrapper::container_wrapper(const libtorrent::aux::container_wrapper<…> &) container_wrapper.hpp:48
[Inlined] $_31::operator()(libtorrent::aux::strong_typedef<…>, const libtorrent::digest32<…> &, const libtorrent::storage_error &) const torrent.cpp:2579
[Inlined] std::__invoke[abi:v15007]<…>($_31 &, libtorrent::aux::strong_typedef<…> &&, const libtorrent::digest32<…> &, const libtorrent::storage_error &) invoke.h:394
[Inlined] std::__invoke_void_return_wrapper::__call<…>($_31 &, libtorrent::aux::strong_typedef<…> &&, const libtorrent::digest32<…> &, const libtorrent::storage_error &) invoke.h:479
[Inlined] std::__function::__alloc_func::operator()[abi:v15007](libtorrent::aux::strong_typedef<…> &&, const libtorrent::digest32<…> &, const libtorrent::storage_error &) function.h:185
std::__function::__func::operator()(libtorrent::aux::strong_typedef<…> &&, const libtorrent::digest32<…> &, const libtorrent::storage_error &) function.h:359
[Inlined] boost::detail::variant::visitation_impl<…>(int, int, boost::detail::variant::invoke_visitor<…> &, void *, mpl_::bool_<…>, boost::variant<…>::has_fallback_type_, mpl_::int_<…> *, boost::detail::variant::visitation_impl_step<…> *) visitation_impl.hpp:0
[Inlined] boost::variant::internal_apply_visitor_impl<…>(int, int, boost::detail::variant::invoke_visitor<…> &, void *) variant.hpp:2338
[Inlined] boost::variant::internal_apply_visitor<…>(boost::detail::variant::invoke_visitor<…> &) variant.hpp:2350
[Inlined] libtorrent::aux::(anonymous namespace)::caller_visitor const::result_type boost::variant<std::__1::function<void (libtorrent::disk_buffer_holder, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<160l> const&, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>, libtorrent::digest32<256l> const&, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::status_t, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::storage_error const&)>, std::__1::function<void ()>, std::__1::function<void (libtorrent::status_t, libtorrent::storage_error const&)>, std::__1::function<void (std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, libtorrent::storage_error const&)>, std::__1::function<void (libtorrent::aux::strong_typedef<int, libtorrent::aux::piece_index_tag, void>)>, std::__1::function<void (libtorrent::storage_error const&, libtorrent::aux::container_wrapper<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, libtorrent::aux::strong_typedef<int, libtorrent::aux::file_index_tag, void>, std::__1::vector<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>, std::__1::allocator<libtorrent::aux::strong_typedef<unsigned char, libtorrent::download_priority_tag, void>>>>)>>::apply_visitor<libtorrent::aux::(anonymous namespace)::caller_visitor const>(libtorrent::aux::(anonymous namespace)::caller_visitor const&) & variant.hpp:2394
[Inlined] boost::apply_visitor<…>(const libtorrent::aux::caller_visitor &, boost::variant<…> &) apply_visitor_unary.hpp:68
libtorrent::aux::mmap_disk_job::call_callback() mmap_disk_job.cpp:133
libtorrent::mmap_disk_io::call_job_handlers() mmap_disk_io.cpp:1803
[Inlined] $_1::operator()() const mmap_disk_io.cpp:1771
[Inlined] boost::asio::detail::binder0::operator()() bind_handler.hpp:60
[Inlined] boost_asio_handler_invoke_helpers::invoke<…>(boost::asio::detail::binder0<…> &, boost::asio::detail::binder0<…> &) handler_invoke_helpers.hpp:51
boost::asio::detail::executor_op::do_complete(void *, boost::asio::detail::scheduler_operation *, const boost::system::error_code &, unsigned long) executor_op.hpp:70
[Inlined] boost::asio::detail::scheduler_operation::complete(void *, const boost::system::error_code &, unsigned long) scheduler_operation.hpp:40
boost::asio::detail::scheduler::do_run_one(boost::asio::detail::conditionally_enabled_mutex::scoped_lock &, boost::asio::detail::scheduler_thread_info &, const boost::system::error_code &) scheduler.ipp:492
boost::asio::detail::scheduler::run(boost::system::error_code &) scheduler.ipp:210
boost::asio::io_context::run() io_context.ipp:63
[Inlined] $_0::operator()() const session.cpp:344
[Inlined] std::__invoke[abi:v15007]<…>($_0 &&) invoke.h:394
[Inlined] std::__thread_execute[abi:v15007]<…>(std::tuple<…> &, std::__tuple_indices<…>) thread:284
std::__thread_proxy[abi:v15007]<…>(void *) thread:295
start_thread 0x00007f30c54c4fd4
__clone3 0x00007f30c55455bc
ukoz commented 1 year ago

Here's the torrent file: example.torrent.zip.

I have no issue adding this, 35GB, tracker "example.com". Not look like correct torrent file, 910KB. Saved resume data only 350KB.

stale[bot] commented 11 months ago

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.

giesmininkas commented 2 months ago

Found the issue and a workaround for it.

With some versions of Clang compilers,

template<typename T>
boost::variant::operator=(T&& value);

is disabled. Libtorrent seems to rely on this operator to be present, for mmap_disk_io::async_hash to work properly.

// libtorrent v2.0.10 src/torrent.cpp:2622
span<sha256_hash> v2_span(block_hashes);
m_ses.disk_thread().async_hash(m_storage, m_checking_piece, v2_span, flags
    , [self = shared_from_this(), hashes = std::move(block_hashes)]
    (piece_index_t p, sha1_hash const& h, storage_error const& e)
    { self->on_piece_hashed(std::move(hashes), p, h, e); });

// libtorrent v2.0.10 src/mmap_disk_io.cpp:868
void mmap_disk_io::async_hash(storage_index_t const storage
    , piece_index_t const piece, span<sha256_hash> const v2, disk_job_flags_t const flags
    , std::function<void(piece_index_t, sha1_hash const&, storage_error const&)> handler)
{
    TORRENT_ASSERT(valid_flags(flags));
    aux::mmap_disk_job* j = m_job_pool.allocate_job(aux::job_action_t::hash);
    j->storage = m_torrents[storage]->shared_from_this();
    j->piece = piece;
    j->d.h.block_hashes = v2;
    j->callback = std::move(handler); // <-- still invokes copy-assignment
    j->flags = flags;
    add_job(j);
}

when mmap_disk_io::async_hash() is called from torrent::on_piece_hashed(), span<...> const v2 is backed by a vector held in handler function object, which gets destroyed, because in the line marked above, the copy-assignment is invoked, and original handler is destructed.

My current workaround is defining BOOST_STRICT_CONFIG for boost::variant to enable the move-assignment operator.

libtorrent version (or branch): v2.0.10 platform/architecture: Linux 6.6.15-amd64 Debian 6.6.15-2 (2024-02-04) x86_64 GNU/Linux compiler and compiler version: Clang 17.0.6 with libc++ 17.0.6