jbaldwin / libcoro

C++20 coroutine library

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Unable to build libcoro with clang

bruno-j-nicoletti opened this issue · comments

Being able to build libcoro with alternate compilers to gcc would be helpful. For my use case that would be clang.

Are there any major blockers that I could possibly help with?

Hi @bruno-j-nicoletti

Last time I checked clang doesn't work with gcc's coroutine stdlib implementation and clang's stdlib implementation doesn't support coroutines yet. That was a few years ago so it's possible things have changed but a quick search it doesn't seem like it.

Clang supports coros according to...

see https://clang.llvm.org/cxx_status.html

It says...

Partial
Fully supported on all targets except Windows, which still has some stability and ABI issues

I'll have a quick dig around in the morning to see which stdlib library it needs to work with.

Just had a very quick play, it seems fine. With clang 16 on Linux, I've successfully built and run the program below with...
clang-16 testIt.cpp -o testIt -std=c++20 -stdlib=libc++ -lc++
and
clang-16 testIt.cpp -o testIt -std=c++20 -stdlib=libstdc++ -lstdc++

#include <concepts>
#include <coroutine>
#include <exception>
#include <iostream>

struct ReturnObject {
  struct promise_type {
    ReturnObject get_return_object() { return {}; }
    std::suspend_never initial_suspend() { return {}; }
    std::suspend_never final_suspend() noexcept { return {}; }
    void unhandled_exception() {}
  };
};

struct Awaiter {
  std::coroutine_handle<> *hp_;
  constexpr bool await_ready() const noexcept { return false; }
  void await_suspend(std::coroutine_handle<> h) { *hp_ = h; }
  constexpr void await_resume() const noexcept {}
};

ReturnObject
counter(std::coroutine_handle<> *continuation_out)
{
  Awaiter a{continuation_out};
  for (unsigned i = 0;; ++i) {
    co_await a;
    std::cout << "counter: " << i << std::endl;
  }
}


int
main()
{
  std::coroutine_handle<> h;
  counter(&h);
  for (int i = 0; i < 3; ++i) {
    std::cout << "In main1 function\n";
    h();
  }
  h.destroy();
  return 0;
}

Also building with -std=gnu++20 works fine with that example.

I've also managed to build it and run for webassembly (my main driver for using clang), via...

emcc testIt.cpp -o testIt.html -std=c++20 -stdlib=libc++ -lc++

and testing that with node via node testIt.js

It didn't build with -stdlib=libstdc++

In which case I'll have a go at getting libcoro running with clang for macos, linux and wasm.

I've had a quick first pass at it today and got it to build and run on Linux with clang-16 with a big of hand fixing. Some issues with transient dependencies on submodules though (catch2 via tl-expected is missing a header somehow). I'll look at tidying that all up tomorrow, but it looks doable.

Awesome, glad to see the clang coroutines have been moved along in a few years. Would be great to add it as a supported compiler for this project.

I'd definitely want to add clang-16 to the GitHub action runs across the various supported distro and to the readme please (there is a template readme file that includes all the examples, if you exit the root readme file it'll get blown away via a git hook pre-commit script). Looking forward to seeing the PR.

Back onto this. I've been battling with the build system somewhat. I've updated to gcc-13 and if I attempt to build it as follows on a clean checkout of your repo...

mkdir build
cd build
cmake ..

I get compilation errors in the dependent catch2 module, which is imported by the vendor 'expected' submodule, which is also the issue I had with clang that I had to fix by hand to get it to work. I'm flummoxed as to what's going on, given that my own code is perfectly happy with catch2 (albeit a different version).

I'm on ubuntu 23.04 with mostly vanilla installs.

Building CXX object _deps/catch2-build/src/CMakeFiles/Catch2.dir/catch2/internal/catch_clara.cpp.o
In file included from /home/bruno/Work/libcoroOrigin/libcoro/build/_deps/catch2-src/src/catch2/internal/catch_clara.cpp:12:
/home/bruno/Work/libcoroOrigin/libcoro/build/_deps/catch2-src/src/catch2/../catch2/internal/catch_string_manip.hpp:47:14: error: ‘uint64_t’ in namespace ‘std’ does not name a type; did you mean ‘wint_t’?
   47 |         std::uint64_t m_count;
      |              ^~~~~~~~
      |              wint_t
/home/bruno/Work/libcoroOrigin/libcoro/build/_deps/catch2-src/src/catch2/../catch2/internal/catch_string_manip.hpp:51:42: error: expected ‘)’ before ‘count’
   51 |         constexpr pluralise(std::uint64_t count, StringRef label):
      |                            ~             ^~~~~~
      |                                          )

I'm lost as to what's going on here.

Given that you are using the tl::expected submodule while you wait for C++23 to be available, and that the license is very very liberal for that module, I'd simply copy that code wholesale into my repo (with appropriate copyright notices maintained), and put a wrapper around it to flip between std::expected and tl::expected depending on the compiler version. I'd also add a switch to CMakeLists.txt to set the C++ standard (FWIW I'm using 23 already for a couple of already implemented features, such as expected). Do you mind if I do that?

I'm good with it, I've been meaning to do something similar on this issue. Catch2 has had some weird issues over time on various gcc versions so I'm not entirely surprised you ran into this.

Would you be up for handling it in its own PR and linking to #145?

Progressing, except that I seem to have both GCC and Clang builds getting stuck in the test benchmark tcp_server echo server thread pool. It passes all other tests in GCC and Clang built in release mode.

I've also tidied up a range of compiler warning that appeared with clang. The one I can't figure is...

In file included from /home/bruno/Work/libcoro/test/bench.cpp:3:
In file included from /home/bruno/Work/libcoro/inc/coro/coro.hpp:18:
In file included from /home/bruno/Work/libcoro/inc/coro/sync_wait.hpp:4:
/home/bruno/Work/libcoro/inc/coro/when_all.hpp:457:1: warning: non-void coroutine does not return a value [-Wreturn-type]
}
^
/home/bruno/Work/libcoro/inc/coro/when_all.hpp:466:33: note: in instantiation of function template specialization 'coro::detail::make_when_all_task<coro::task<unsigned long>, unsigned long &&>' requested here
        std::make_tuple(detail::make_when_all_task(std::move(awaitables))...));

https://github.com/bruno-j-nicoletti/libcoro

Is where I'm up to, on the dev/bruno/clangSupport branch. I added a shell script to generate builds,

makeBuild.sh --clang --debug

Will generate a cmake folder called Debug-Clang, similarly for --release and --gcc.

Progressing, except that I seem to have both GCC and Clang builds getting stuck in the test benchmark tcp_server echo server thread pool. It passes all other tests in GCC and Clang built in release mode.

I've spent a fair bit of time today trying to track down what exactly is causing the deadlock and I've had no luck. Do you have any vague idea where it might be?

Might be the ssl tests, can you try using the build define to disable those and see if it disappears? Sorry had a busy labor day weekend!

I've turned off the SSL feature and turned off the networking tests, but it still hangs. It's hanging in a benchmark test though, which is using tcp via coro::io_scheduler, which looks to be orthogonal to the SSL feature, so I'm not sure turning off SSL would help much. This is with GCC and not clang (same problem arises in clang).

Still flumoxed. Everything else is as happy as can be. Would you mind cloning my repo and seeing if you can replicate it on your setup?

I'll try and give your fork/branch a try tonight after work.

Thanks. Meanwhile I'm trying to get it to build with emscripten to web assembly. This had problems as the EMSDK doesn't support jthreads from C++20 yet. Currently I'm tweaking coro::thread_pool to work with an ordinary std::thread if being built to emscipten. I've got a bunch of test working in web assembly, but I need to tweak how the thread pool handles stop requests.

ETA: Fixed thread pools. The remaining issue is that coro::io_scheduler can't currently work in web assembly, which I've added a switch for cmake to control if it is built or not, but a bunch of tests rely on it. I'll look at those tomorrow. I have a dev/bruno/wasm branch in my repo that works.

I've got clang-16 and lld installed, and I modified the CMakeLists.txt to work correctly with them. I'm not sure I like the makeBuild.sh, its definitely got some settings in it that should be in the CMakeLists.txt files like setting the linker and the stdlib.

I'm running into catch2 compiler problems like you had above, what exactly did you do to get over that? I tried updating to the latest release version, catch2 v3.4.0 but it still has the same issues. I'd prefer not to use the devel branch if possible.

Hi Josh,

sorry for the radio silence. I broke my linux distro completely and had to reinstall everything to get going again.

The makebuild.sh can be burnt once this is ready to go, I just wanted something to make reproducible builds with minimal typing while I try to get it working. Also I've just added a CMakeClangOverrides.txt for clang on my install, to force it to get the gcc headers from gcc-12 (it was fetching g++-13 headers and breaking). That too can be burnt once this is good to go. Ignore that.

I don't have the catch2 issue as I removed the dependency on the external tl::expected package, which cause it. I did that by copying that header file (with copyrights) into coro/inc/detail/tl_unexpected.hpp directly. This let me remove 'tl/expected' as a sub repository, and so the transitive catch2 build problem. So I'm not quite sure why you are getting that catch2 problem, as the only catch2 will be the code you've copied into your repo via catch_amalgamated.cpp/hpp.

Which package is on the devel branch?

I've also tidied a few things up since you last checked it out, eg: attributes are now using the C++ standard [[ATTRIBUTE]] notation.

B

I've tidied up the build so I could burn CMakeClangOverrides.txt. It all builds and runs all tests on my machine (gcc12 and clang16) with the exception of benchmark tcp_server echo server thread pool which dead locks.

Ok, I figured out what I was doing wrong, I forgot to set lld-16 and was using just lld which is version 14 on the ubuntu I'm using. I'll see if I can reproduce the deadlock now.

All tests passed (1798621 assertions in 103 test cases)

Hmmm, passed first try using clang++-16 clang-16 and lld-16. Is it consistently happening for you on every run? I might need what kind of hardware you are running on, I'm using a 4 year old laptop, but its got 12~ cores so I might be masking a problem somehow with number of cores I've got.

I've got an 8 core AMD Ryzen 5700G mini-itx system for my linux work, running Ubuntu 23.04. I've got clang-16, gcc-12 and gcc-13 installed. Apart from the dev env, it's a vanilla Ubuntu system.

I get the deadlock with both clang and gcc.

I'm now working on getting a web assembly build, which is ultimately what I'd like to push to the mainline as an experimental feature (but it works well enough for my cases so far). It's a branch off the clang work I was doing. I've had to modify coro::thread_pool to conditionally use std::threads when building with the emscripten C++ compiler, and it can't build the coro::io_scheduler as the <sys/poll.h> system header isn't available. That means a whole bunch of tests can't be run as they rely on io_scheduler. Given those caveats, my wasm branch will build with gcc, clang to native and emscripten to wasm. The wasm build doesn't pass all tests yet, which I'm working on.

see my branch

https://github.com/bruno-j-nicoletti/libcoro/tree/dev/bruno/wasm

FWIW, web assembly performance is mostly on a par with gcc in most benchmark tests.

Sorry, to confirm the deadlock is on vanilla ubuntu with gcc + clang builds, not the wasm build? Just a little confused.

Sorry, to confirm the deadlock is on vanilla ubuntu with gcc + clang builds, not the wasm build? Just a little confused.

The WASM build can't compile the io_scheduluer, because it relies on sys/poll.h. So it doesn't run the test that hangs. GCC and Clang do run that test and do hang.

Sorry I've been really busy. I haven't been able to reproduce the issue though with my setup, I've had problems in SSL before hanging which is why I suggested disabling that but not on anything else. Would it be possible if you could run the tests in maybe gdb and get a stack trace across the threads that I could look at? That might help.

No problem.

I just tried building it without SSL, and it works fine without hanging. So that seems to be the issue.

When I build it with SSL, on my dev/bruno/wasm branch, compiled RelWithDebInfo on gcc it hangs. The gdb session is below, I run that one breaking test, have it hang, interupt the program and dump the stack trace on all threads.

gdb ./test/libcoro_test
GNU gdb (Ubuntu 13.1-2ubuntu2) 13.1
Copyright (C) 2023 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./test/libcoro_test...
(gdb) run "benchmark tcp_server echo server thread pool"
Starting program: /home/bruno/Work/libcoro/RelWithDebInfo-GCC/test/libcoro_test "benchmark tcp_server echo server thread pool"
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
[Detaching after vfork from child process 137768]
.....+.+...............+...+......+......+......+.....+...............+...+.+.....+......+.......+.....+..........+...........+.+......+.....+.......+..+..........+.........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*...+....+............+..+......+............+....+.....+.+.................+.+..............+.+..+....+......+.....+...................+......+..+...+...+......+...............+.........+....+......+.........+..+...+......+.+......+..+...+............+.............+...+..+.........+......+....+......+........+.........+.......+.........+..+...+....+.....+......+.......+...+.....+.......+.....+...+.........+..........+..................+.....+..............................+...+.+.........+.....+......+...+.............+..+................+...........+.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
.+.+....................+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*...........+............+..+.+.....+.+.....+.........+......+.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*......+......+...........+...+...........................+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-----
Filters: "benchmark tcp_server echo server thread pool"
Randomness seeded to: 1639048458
[New Thread 0x7ffff71ff6c0 (LWP 137770)]
[New Thread 0x7ffff69fe6c0 (LWP 137771)]
[New Thread 0x7ffff61fd6c0 (LWP 137772)]
[New Thread 0x7ffff59fc6c0 (LWP 137773)]
[New Thread 0x7ffff51fb6c0 (LWP 137774)]
[New Thread 0x7ffff49fa6c0 (LWP 137775)]
[New Thread 0x7fffe7fff6c0 (LWP 137776)]
[New Thread 0x7fffe77fe6c0 (LWP 137777)]
[New Thread 0x7fffdffff6c0 (LWP 137781)]
[New Thread 0x7fffe6ffd6c0 (LWP 137782)]
[New Thread 0x7fffdeffd6c0 (LWP 137780)]
[New Thread 0x7fffde7fc6c0 (LWP 137778)]
[New Thread 0x7fffddffb6c0 (LWP 137779)]
[New Thread 0x7fffe67fc6c0 (LWP 137783)]
[New Thread 0x7fffdf7fe6c0 (LWP 137787)]
[New Thread 0x7fffe5ffb6c0 (LWP 137785)]
[New Thread 0x7fffe4ff96c0 (LWP 137786)]
[New Thread 0x7fffe57fa6c0 (LWP 137784)]
[New Thread 0x7fffdd7fa6c0 (LWP 137790)]
[New Thread 0x7fffdcff96c0 (LWP 137792)]
[New Thread 0x7fffd7fff6c0 (LWP 137789)]
[New Thread 0x7fffd77fe6c0 (LWP 137791)]
[New Thread 0x7fffd6ffd6c0 (LWP 137788)]
[New Thread 0x7fffd67fc6c0 (LWP 137793)]
[New Thread 0x7fffd5ffb6c0 (LWP 137794)]
[New Thread 0x7fffd57fa6c0 (LWP 137795)]
[New Thread 0x7fffd4ff96c0 (LWP 137796)]
[New Thread 0x7fffcffff6c0 (LWP 137797)]
[New Thread 0x7fffcf7fe6c0 (LWP 137798)]
[New Thread 0x7fffceffd6c0 (LWP 137799)]
[New Thread 0x7fffce7fc6c0 (LWP 137800)]
[New Thread 0x7fffcdffb6c0 (LWP 137801)]
[New Thread 0x7fffcd7fa6c0 (LWP 137802)]
[New Thread 0x7fffc7fff6c0 (LWP 137804)]
[New Thread 0x7fffc77fe6c0 (LWP 137805)]
[New Thread 0x7fffccff96c0 (LWP 137803)]
[New Thread 0x7fffc5ffb6c0 (LWP 137808)]
[New Thread 0x7fffc57fa6c0 (LWP 137809)]
[New Thread 0x7fffc6ffd6c0 (LWP 137807)]
[New Thread 0x7fffc67fc6c0 (LWP 137806)]
[New Thread 0x7fff9effd6c0 (LWP 137810)]
[New Thread 0x7fff9e7fc6c0 (LWP 137814)]
[New Thread 0x7fffc4ff96c0 (LWP 137811)]
[New Thread 0x7fff9ffff6c0 (LWP 137812)]
[New Thread 0x7fff9f7fe6c0 (LWP 137813)]
[New Thread 0x7fff9dffb6c0 (LWP 137816)]
[New Thread 0x7fff737fe6c0 (LWP 137819)]
[New Thread 0x7fff9d7fa6c0 (LWP 137815)]
[New Thread 0x7fff9cff96c0 (LWP 137818)]
[New Thread 0x7fff7bfff6c0 (LWP 137817)]
[New Thread 0x7fff7b7fe6c0 (LWP 137822)]
[New Thread 0x7fff7affd6c0 (LWP 137821)]
[New Thread 0x7fff7a7fc6c0 (LWP 137820)]
[New Thread 0x7fff79ffb6c0 (LWP 137823)]
[New Thread 0x7fff797fa6c0 (LWP 137824)]
[New Thread 0x7fff78ff96c0 (LWP 137826)]
[New Thread 0x7fff73fff6c0 (LWP 137825)]
[New Thread 0x7fff72ffd6c0 (LWP 137827)]
[New Thread 0x7fff727fc6c0 (LWP 137828)]
[New Thread 0x7fff71ffb6c0 (LWP 137829)]
[Thread 0x7fffcffff6c0 (LWP 137797) exited]
[Thread 0x7fffd5ffb6c0 (LWP 137794) exited]
[Thread 0x7fffd67fc6c0 (LWP 137793) exited]
[Thread 0x7fffdcff96c0 (LWP 137792) exited]
[Thread 0x7fffdd7fa6c0 (LWP 137790) exited]
[Thread 0x7fffdf7fe6c0 (LWP 137787) exited]
[Thread 0x7fffe67fc6c0 (LWP 137783) exited]
[Thread 0x7fffe6ffd6c0 (LWP 137782) exited]
[Thread 0x7fffe57fa6c0 (LWP 137784) exited]
[Thread 0x7fffddffb6c0 (LWP 137779) exited]
[Thread 0x7ffff49fa6c0 (LWP 137775) exited]
[Thread 0x7ffff61fd6c0 (LWP 137772) exited]
[Thread 0x7fffd77fe6c0 (LWP 137791) exited]
[Thread 0x7fffe4ff96c0 (LWP 137786) exited]
[Thread 0x7ffff51fb6c0 (LWP 137774) exited]
[Thread 0x7fffe77fe6c0 (LWP 137777) exited]
[Thread 0x7fffd7fff6c0 (LWP 137789) exited]
[Thread 0x7fffe5ffb6c0 (LWP 137785) exited]
[Thread 0x7fffdeffd6c0 (LWP 137780) exited]
[Thread 0x7fffde7fc6c0 (LWP 137778) exited]
^C
Thread 1 "libcoro_test" received signal SIGINT, Interrupt.
__futex_abstimed_wait_common64 (private=128, cancel=true, abstime=0x0, op=265, expected=137800, futex_word=0x7fffce7fc990) at ./nptl/futex-internal.c:57
57	./nptl/futex-internal.c: No such file or directory.
(gdb) thread apply all bt

Thread 61 (Thread 0x7fff71ffb6c0 (LWP 137829) "libcoro_test"):
#0  0x00007ffff731dff6 in epoll_wait (epfd=44, events=0x7fff7c000cf0, maxevents=16, timeout=1000) at ../sysdeps/unix/sysv/linux/epoll_wait.c:30
#1  0x0000555555681af1 in coro::io_scheduler::process_events_execute (this=this@entry=0x7fff7c000b80, timeout=..., timeout@entry=std::chrono::duration = { 1000ms }) at /home/bruno/Work/libcoro/src/io_scheduler.cpp:238
#2  0x00005555556820af in coro::io_scheduler::process_events_dedicated_thread (this=0x7fff7c000b80) at /home/bruno/Work/libcoro/src/io_scheduler.cpp:226
#3  0x00007ffff76e6363 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#4  0x00007ffff728f18a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
#5  0x00007ffff731dbd0 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 60 (Thread 0x7fff727fc6c0 (LWP 137828) "libcoro_test"):
#0  0x00007ffff731dff6 in epoll_wait (epfd=40, events=0x7fffa4000cf0, maxevents=16, timeout=1000) at ../sysdeps/unix/sysv/linux/epoll_wait.c:30
#1  0x0000555555681af1 in coro::io_scheduler::process_events_execute (this=this@entry=0x7fffa4000b80, timeout=..., timeout@entry=std::chrono::duration = { 1000ms }) at /home/bruno/Work/libcoro/src/io_scheduler.cpp:238
#2  0x00005555556820af in coro::io_scheduler::process_events_dedicated_thread (this=0x7fffa4000b80) at /home/bruno/Work/libcoro/src/io_scheduler.cpp:226
#3  0x00007ffff76e6363 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#4  0x00007ffff728f18a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
#5  0x00007ffff731dbd0 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 59 (Thread 0x7fff72ffd6c0 (LWP 137827) "libcoro_test"):
#0  __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x7fff7c001088) at ./nptl/futex-internal.c:57
#1  __futex_abstimed_wait_common (cancel=true, private=0, abstime=0x0, clockid=0, expected=0, futex_word=0x7fff7c001088) at ./nptl/futex-internal.c:87
#2  __GI___futex_abstimed_wait_cancelable64 (futex_word=futex_word@entry=0x7fff7c001088, expected=expected@entry=0, clockid=clockid@entry=0, abstime=abstime@entry=0x0, private=private@entry=0) at ./nptl/futex-internal.c:139
#3  0x00007ffff728e0c8 in __pthread_cond_wait_common (abstime=0x0, clockid=0, mutex=0x7fff7c001120, cond=0x7fff7c001060) at ./nptl/pthread_cond_wait.c:503
#4  ___pthread_cond_wait (cond=0x7fff7c001060, mutex=0x7fff7c001120) at ./nptl/pthread_cond_wait.c:627
#5  0x000055555567f761 in std::_V2::condition_variable_any::wait<std::unique_lock<std::mutex>, coro::thread_pool::executor(std::stop_token, std::size_t)::<lambda()> > (__p=..., __stoken=..., __lock=..., this=<optimized out>) at /usr/include/c++/12/condition_variable:387
#6  coro::thread_pool::executor (this=0x7fff7c000fd0, stop_token=..., idx=3) at /home/bruno/Work/libcoro/src/thread_pool.cpp:108
#7  0x000055555567fb6c in operator() (__closure=<optimized out>, st=...) at /home/bruno/Work/libcoro/src/thread_pool.cpp:28
#8  std::__invoke_impl<void, coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> (__f=...) at /usr/include/c++/12/bits/invoke.h:61
#9  std::__invoke<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> (__fn=...) at /usr/include/c++/12/bits/invoke.h:96
#10 std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> >::_M_invoke<0, 1> (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:279
#11 std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> >::operator() (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:286
#12 std::thread::_State_impl<std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> > >::_M_run(void) (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:231
#13 0x00007ffff76e6363 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#14 0x00007ffff728f18a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
#15 0x00007ffff731dbd0 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 58 (Thread 0x7fff73fff6c0 (LWP 137825) "libcoro_test"):
#0  0x00007ffff731dff6 in epoll_wait (epfd=36, events=0x7fffa8000cf0, maxevents=16, timeout=1000) at ../sysdeps/unix/sysv/linux/epoll_wait.c:30
#1  0x0000555555681af1 in coro::io_scheduler::process_events_execute (this=this@entry=0x7fffa8000b80, timeout=..., timeout@entry=std::chrono::duration = { 1000ms }) at /home/bruno/Work/libcoro/src/io_scheduler.cpp:238
#2  0x00005555556820af in coro::io_scheduler::process_events_dedicated_thread (this=0x7fffa8000b80) at /home/bruno/Work/libcoro/src/io_scheduler.cpp:226
#3  0x00007ffff76e6363 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#4  0x00007ffff728f18a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
#5  0x00007ffff731dbd0 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 57 (Thread 0x7fff78ff96c0 (LWP 137826) "libcoro_test"):
#0  __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x7fffa4001088) at ./nptl/futex-internal.c:57
#1  __futex_abstimed_wait_common (cancel=true, private=0, abstime=0x0, clockid=0, expected=0, futex_word=0x7fffa4001088) at ./nptl/futex-internal.c:87
#2  __GI___futex_abstimed_wait_cancelable64 (futex_word=futex_word@entry=0x7fffa4001088, expected=expected@entry=0, clockid=clockid@entry=0, abstime=abstime@entry=0x0, private=private@entry=0) at ./nptl/futex-internal.c:139
#3  0x00007ffff728e0c8 in __pthread_cond_wait_common (abstime=0x0, clockid=0, mutex=0x7fffa4001120, cond=0x7fffa4001060) at ./nptl/pthread_cond_wait.c:503
#4  ___pthread_cond_wait (cond=0x7fffa4001060, mutex=0x7fffa4001120) at ./nptl/pthread_cond_wait.c:627
#5  0x000055555567f761 in std::_V2::condition_variable_any::wait<std::unique_lock<std::mutex>, coro::thread_pool::executor(std::stop_token, std::size_t)::<lambda()> > (__p=..., __stoken=..., __lock=..., this=<optimized out>) at /usr/include/c++/12/condition_variable:387
#6  coro::thread_pool::executor (this=0x7fffa4000fd0, stop_token=..., idx=3) at /home/bruno/Work/libcoro/src/thread_pool.cpp:108
#7  0x000055555567fb6c in operator() (__closure=<optimized out>, st=...) at /home/bruno/Work/libcoro/src/thread_pool.cpp:28
--Type <RET> for more, q to quit, c to continue without paging--c
#8  std::__invoke_impl<void, coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> (__f=...) at /usr/include/c++/12/bits/invoke.h:61
#9  std::__invoke<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> (__fn=...) at /usr/include/c++/12/bits/invoke.h:96
#10 std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> >::_M_invoke<0, 1> (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:279
#11 std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> >::operator() (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:286
#12 std::thread::_State_impl<std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> > >::_M_run(void) (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:231
#13 0x00007ffff76e6363 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#14 0x00007ffff728f18a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
#15 0x00007ffff731dbd0 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 56 (Thread 0x7fff797fa6c0 (LWP 137824) "libcoro_test"):
#0  __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x7fff7c00108c) at ./nptl/futex-internal.c:57
#1  __futex_abstimed_wait_common (cancel=true, private=0, abstime=0x0, clockid=0, expected=0, futex_word=0x7fff7c00108c) at ./nptl/futex-internal.c:87
#2  __GI___futex_abstimed_wait_cancelable64 (futex_word=futex_word@entry=0x7fff7c00108c, expected=expected@entry=0, clockid=clockid@entry=0, abstime=abstime@entry=0x0, private=private@entry=0) at ./nptl/futex-internal.c:139
#3  0x00007ffff728e0c8 in __pthread_cond_wait_common (abstime=0x0, clockid=0, mutex=0x7fff7c001120, cond=0x7fff7c001060) at ./nptl/pthread_cond_wait.c:503
#4  ___pthread_cond_wait (cond=0x7fff7c001060, mutex=0x7fff7c001120) at ./nptl/pthread_cond_wait.c:627
#5  0x000055555567f761 in std::_V2::condition_variable_any::wait<std::unique_lock<std::mutex>, coro::thread_pool::executor(std::stop_token, std::size_t)::<lambda()> > (__p=..., __stoken=..., __lock=..., this=<optimized out>) at /usr/include/c++/12/condition_variable:387
#6  coro::thread_pool::executor (this=0x7fff7c000fd0, stop_token=..., idx=2) at /home/bruno/Work/libcoro/src/thread_pool.cpp:108
#7  0x000055555567fb6c in operator() (__closure=<optimized out>, st=...) at /home/bruno/Work/libcoro/src/thread_pool.cpp:28
#8  std::__invoke_impl<void, coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> (__f=...) at /usr/include/c++/12/bits/invoke.h:61
#9  std::__invoke<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> (__fn=...) at /usr/include/c++/12/bits/invoke.h:96
#10 std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> >::_M_invoke<0, 1> (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:279
#11 std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> >::operator() (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:286
#12 std::thread::_State_impl<std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> > >::_M_run(void) (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:231
#13 0x00007ffff76e6363 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#14 0x00007ffff728f18a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
#15 0x00007ffff731dbd0 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 55 (Thread 0x7fff79ffb6c0 (LWP 137823) "libcoro_test"):
#0  0x00007ffff731dff6 in epoll_wait (epfd=32, events=0x7fffb4000cf0, maxevents=16, timeout=1000) at ../sysdeps/unix/sysv/linux/epoll_wait.c:30
#1  0x0000555555681af1 in coro::io_scheduler::process_events_execute (this=this@entry=0x7fffb4000b80, timeout=..., timeout@entry=std::chrono::duration = { 1000ms }) at /home/bruno/Work/libcoro/src/io_scheduler.cpp:238
#2  0x00005555556820af in coro::io_scheduler::process_events_dedicated_thread (this=0x7fffb4000b80) at /home/bruno/Work/libcoro/src/io_scheduler.cpp:226
#3  0x00007ffff76e6363 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#4  0x00007ffff728f18a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
#5  0x00007ffff731dbd0 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 54 (Thread 0x7fff7a7fc6c0 (LWP 137820) "libcoro_test"):
#0  __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x7fffa800108c) at ./nptl/futex-internal.c:57
#1  __futex_abstimed_wait_common (cancel=true, private=0, abstime=0x0, clockid=0, expected=0, futex_word=0x7fffa800108c) at ./nptl/futex-internal.c:87
#2  __GI___futex_abstimed_wait_cancelable64 (futex_word=futex_word@entry=0x7fffa800108c, expected=expected@entry=0, clockid=clockid@entry=0, abstime=abstime@entry=0x0, private=private@entry=0) at ./nptl/futex-internal.c:139
#3  0x00007ffff728e0c8 in __pthread_cond_wait_common (abstime=0x0, clockid=0, mutex=0x7fffa8001120, cond=0x7fffa8001060) at ./nptl/pthread_cond_wait.c:503
#4  ___pthread_cond_wait (cond=0x7fffa8001060, mutex=0x7fffa8001120) at ./nptl/pthread_cond_wait.c:627
#5  0x000055555567f761 in std::_V2::condition_variable_any::wait<std::unique_lock<std::mutex>, coro::thread_pool::executor(std::stop_token, std::size_t)::<lambda()> > (__p=..., __stoken=..., __lock=..., this=<optimized out>) at /usr/include/c++/12/condition_variable:387
#6  coro::thread_pool::executor (this=0x7fffa8000fd0, stop_token=..., idx=3) at /home/bruno/Work/libcoro/src/thread_pool.cpp:108
#7  0x000055555567fb6c in operator() (__closure=<optimized out>, st=...) at /home/bruno/Work/libcoro/src/thread_pool.cpp:28
#8  std::__invoke_impl<void, coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> (__f=...) at /usr/include/c++/12/bits/invoke.h:61
#9  std::__invoke<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> (__fn=...) at /usr/include/c++/12/bits/invoke.h:96
#10 std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> >::_M_invoke<0, 1> (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:279
#11 std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> >::operator() (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:286
#12 std::thread::_State_impl<std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> > >::_M_run(void) (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:231
#13 0x00007ffff76e6363 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#14 0x00007ffff728f18a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
#15 0x00007ffff731dbd0 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 53 (Thread 0x7fff7affd6c0 (LWP 137821) "libcoro_test"):
#0  __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x7fffa4001088) at ./nptl/futex-internal.c:57
#1  __futex_abstimed_wait_common (cancel=true, private=0, abstime=0x0, clockid=0, expected=0, futex_word=0x7fffa4001088) at ./nptl/futex-internal.c:87
#2  __GI___futex_abstimed_wait_cancelable64 (futex_word=futex_word@entry=0x7fffa4001088, expected=expected@entry=0, clockid=clockid@entry=0, abstime=abstime@entry=0x0, private=private@entry=0) at ./nptl/futex-internal.c:139
#3  0x00007ffff728e0c8 in __pthread_cond_wait_common (abstime=0x0, clockid=0, mutex=0x7fffa4001120, cond=0x7fffa4001060) at ./nptl/pthread_cond_wait.c:503
#4  ___pthread_cond_wait (cond=0x7fffa4001060, mutex=0x7fffa4001120) at ./nptl/pthread_cond_wait.c:627
#5  0x000055555567f761 in std::_V2::condition_variable_any::wait<std::unique_lock<std::mutex>, coro::thread_pool::executor(std::stop_token, std::size_t)::<lambda()> > (__p=..., __stoken=..., __lock=..., this=<optimized out>) at /usr/include/c++/12/condition_variable:387
#6  coro::thread_pool::executor (this=0x7fffa4000fd0, stop_token=..., idx=2) at /home/bruno/Work/libcoro/src/thread_pool.cpp:108
#7  0x000055555567fb6c in operator() (__closure=<optimized out>, st=...) at /home/bruno/Work/libcoro/src/thread_pool.cpp:28
#8  std::__invoke_impl<void, coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> (__f=...) at /usr/include/c++/12/bits/invoke.h:61
#9  std::__invoke<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> (__fn=...) at /usr/include/c++/12/bits/invoke.h:96
#10 std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> >::_M_invoke<0, 1> (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:279
#11 std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> >::operator() (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:286
#12 std::thread::_State_impl<std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> > >::_M_run(void) (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:231
#13 0x00007ffff76e6363 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#14 0x00007ffff728f18a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
#15 0x00007ffff731dbd0 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 52 (Thread 0x7fff7b7fe6c0 (LWP 137822) "libcoro_test"):
#0  __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x7fff7c001088) at ./nptl/futex-internal.c:57
#1  __futex_abstimed_wait_common (cancel=true, private=0, abstime=0x0, clockid=0, expected=0, futex_word=0x7fff7c001088) at ./nptl/futex-internal.c:87
#2  __GI___futex_abstimed_wait_cancelable64 (futex_word=futex_word@entry=0x7fff7c001088, expected=expected@entry=0, clockid=clockid@entry=0, abstime=abstime@entry=0x0, private=private@entry=0) at ./nptl/futex-internal.c:139
#3  0x00007ffff728e0c8 in __pthread_cond_wait_common (abstime=0x0, clockid=0, mutex=0x7fff7c001120, cond=0x7fff7c001060) at ./nptl/pthread_cond_wait.c:503
#4  ___pthread_cond_wait (cond=0x7fff7c001060, mutex=0x7fff7c001120) at ./nptl/pthread_cond_wait.c:627
#5  0x000055555567f761 in std::_V2::condition_variable_any::wait<std::unique_lock<std::mutex>, coro::thread_pool::executor(std::stop_token, std::size_t)::<lambda()> > (__p=..., __stoken=..., __lock=..., this=<optimized out>) at /usr/include/c++/12/condition_variable:387
#6  coro::thread_pool::executor (this=0x7fff7c000fd0, stop_token=..., idx=1) at /home/bruno/Work/libcoro/src/thread_pool.cpp:108
#7  0x000055555567fb6c in operator() (__closure=<optimized out>, st=...) at /home/bruno/Work/libcoro/src/thread_pool.cpp:28
#8  std::__invoke_impl<void, coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> (__f=...) at /usr/include/c++/12/bits/invoke.h:61
#9  std::__invoke<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> (__fn=...) at /usr/include/c++/12/bits/invoke.h:96
#10 std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> >::_M_invoke<0, 1> (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:279
#11 std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> >::operator() (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:286
#12 std::thread::_State_impl<std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> > >::_M_run(void) (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:231
#13 0x00007ffff76e6363 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#14 0x00007ffff728f18a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
#15 0x00007ffff731dbd0 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 51 (Thread 0x7fff7bfff6c0 (LWP 137817) "libcoro_test"):
#0  0x00007ffff731dff6 in epoll_wait (epfd=28, events=0x7fffb0000cf0, maxevents=16, timeout=1000) at ../sysdeps/unix/sysv/linux/epoll_wait.c:30
#1  0x0000555555681af1 in coro::io_scheduler::process_events_execute (this=this@entry=0x7fffb0000b80, timeout=..., timeout@entry=std::chrono::duration = { 1000ms }) at /home/bruno/Work/libcoro/src/io_scheduler.cpp:238
#2  0x00005555556820af in coro::io_scheduler::process_events_dedicated_thread (this=0x7fffb0000b80) at /home/bruno/Work/libcoro/src/io_scheduler.cpp:226
#3  0x00007ffff76e6363 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#4  0x00007ffff728f18a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
#5  0x00007ffff731dbd0 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 50 (Thread 0x7fff9cff96c0 (LWP 137818) "libcoro_test"):
#0  __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x7fffb4001088) at ./nptl/futex-internal.c:57
#1  __futex_abstimed_wait_common (cancel=true, private=0, abstime=0x0, clockid=0, expected=0, futex_word=0x7fffb4001088) at ./nptl/futex-internal.c:87
#2  __GI___futex_abstimed_wait_cancelable64 (futex_word=futex_word@entry=0x7fffb4001088, expected=expected@entry=0, clockid=clockid@entry=0, abstime=abstime@entry=0x0, private=private@entry=0) at ./nptl/futex-internal.c:139
#3  0x00007ffff728e0c8 in __pthread_cond_wait_common (abstime=0x0, clockid=0, mutex=0x7fffb4001120, cond=0x7fffb4001060) at ./nptl/pthread_cond_wait.c:503
#4  ___pthread_cond_wait (cond=0x7fffb4001060, mutex=0x7fffb4001120) at ./nptl/pthread_cond_wait.c:627
#5  0x000055555567f761 in std::_V2::condition_variable_any::wait<std::unique_lock<std::mutex>, coro::thread_pool::executor(std::stop_token, std::size_t)::<lambda()> > (__p=..., __stoken=..., __lock=..., this=<optimized out>) at /usr/include/c++/12/condition_variable:387
#6  coro::thread_pool::executor (this=0x7fffb4000fd0, stop_token=..., idx=3) at /home/bruno/Work/libcoro/src/thread_pool.cpp:108
#7  0x000055555567fb6c in operator() (__closure=<optimized out>, st=...) at /home/bruno/Work/libcoro/src/thread_pool.cpp:28
#8  std::__invoke_impl<void, coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> (__f=...) at /usr/include/c++/12/bits/invoke.h:61
#9  std::__invoke<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> (__fn=...) at /usr/include/c++/12/bits/invoke.h:96
#10 std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> >::_M_invoke<0, 1> (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:279
#11 std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> >::operator() (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:286
#12 std::thread::_State_impl<std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> > >::_M_run(void) (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:231
#13 0x00007ffff76e6363 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#14 0x00007ffff728f18a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
#15 0x00007ffff731dbd0 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 49 (Thread 0x7fff9d7fa6c0 (LWP 137815) "libcoro_test"):
#0  __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x7fffa8001088) at ./nptl/futex-internal.c:57
#1  __futex_abstimed_wait_common (cancel=true, private=0, abstime=0x0, clockid=0, expected=0, futex_word=0x7fffa8001088) at ./nptl/futex-internal.c:87
#2  __GI___futex_abstimed_wait_cancelable64 (futex_word=futex_word@entry=0x7fffa8001088, expected=expected@entry=0, clockid=clockid@entry=0, abstime=abstime@entry=0x0, private=private@entry=0) at ./nptl/futex-internal.c:139
#3  0x00007ffff728e0c8 in __pthread_cond_wait_common (abstime=0x0, clockid=0, mutex=0x7fffa8001120, cond=0x7fffa8001060) at ./nptl/pthread_cond_wait.c:503
#4  ___pthread_cond_wait (cond=0x7fffa8001060, mutex=0x7fffa8001120) at ./nptl/pthread_cond_wait.c:627
#5  0x000055555567f761 in std::_V2::condition_variable_any::wait<std::unique_lock<std::mutex>, coro::thread_pool::executor(std::stop_token, std::size_t)::<lambda()> > (__p=..., __stoken=..., __lock=..., this=<optimized out>) at /usr/include/c++/12/condition_variable:387
#6  coro::thread_pool::executor (this=0x7fffa8000fd0, stop_token=..., idx=2) at /home/bruno/Work/libcoro/src/thread_pool.cpp:108
#7  0x000055555567fb6c in operator() (__closure=<optimized out>, st=...) at /home/bruno/Work/libcoro/src/thread_pool.cpp:28
#8  std::__invoke_impl<void, coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> (__f=...) at /usr/include/c++/12/bits/invoke.h:61
#9  std::__invoke<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> (__fn=...) at /usr/include/c++/12/bits/invoke.h:96
#10 std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> >::_M_invoke<0, 1> (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:279
#11 std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> >::operator() (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:286
#12 std::thread::_State_impl<std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> > >::_M_run(void) (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:231
#13 0x00007ffff76e6363 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#14 0x00007ffff728f18a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
#15 0x00007ffff731dbd0 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 48 (Thread 0x7fff737fe6c0 (LWP 137819) "libcoro_test"):
#0  __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x7fff7c001088) at ./nptl/futex-internal.c:57
#1  __futex_abstimed_wait_common (cancel=true, private=0, abstime=0x0, clockid=0, expected=0, futex_word=0x7fff7c001088) at ./nptl/futex-internal.c:87
#2  __GI___futex_abstimed_wait_cancelable64 (futex_word=futex_word@entry=0x7fff7c001088, expected=expected@entry=0, clockid=clockid@entry=0, abstime=abstime@entry=0x0, private=private@entry=0) at ./nptl/futex-internal.c:139
#3  0x00007ffff728e0c8 in __pthread_cond_wait_common (abstime=0x0, clockid=0, mutex=0x7fff7c001120, cond=0x7fff7c001060) at ./nptl/pthread_cond_wait.c:503
#4  ___pthread_cond_wait (cond=0x7fff7c001060, mutex=0x7fff7c001120) at ./nptl/pthread_cond_wait.c:627
#5  0x000055555567f761 in std::_V2::condition_variable_any::wait<std::unique_lock<std::mutex>, coro::thread_pool::executor(std::stop_token, std::size_t)::<lambda()> > (__p=..., __stoken=..., __lock=..., this=<optimized out>) at /usr/include/c++/12/condition_variable:387
#6  coro::thread_pool::executor (this=0x7fff7c000fd0, stop_token=..., idx=0) at /home/bruno/Work/libcoro/src/thread_pool.cpp:108
#7  0x000055555567fb6c in operator() (__closure=<optimized out>, st=...) at /home/bruno/Work/libcoro/src/thread_pool.cpp:28
#8  std::__invoke_impl<void, coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> (__f=...) at /usr/include/c++/12/bits/invoke.h:61
#9  std::__invoke<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> (__fn=...) at /usr/include/c++/12/bits/invoke.h:96
#10 std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> >::_M_invoke<0, 1> (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:279
#11 std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> >::operator() (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:286
#12 std::thread::_State_impl<std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> > >::_M_run(void) (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:231
#13 0x00007ffff76e6363 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#14 0x00007ffff728f18a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
#15 0x00007ffff731dbd0 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 47 (Thread 0x7fff9dffb6c0 (LWP 137816) "libcoro_test"):
#0  __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x7fffa4001088) at ./nptl/futex-internal.c:57
#1  __futex_abstimed_wait_common (cancel=true, private=0, abstime=0x0, clockid=0, expected=0, futex_word=0x7fffa4001088) at ./nptl/futex-internal.c:87
#2  __GI___futex_abstimed_wait_cancelable64 (futex_word=futex_word@entry=0x7fffa4001088, expected=expected@entry=0, clockid=clockid@entry=0, abstime=abstime@entry=0x0, private=private@entry=0) at ./nptl/futex-internal.c:139
#3  0x00007ffff728e0c8 in __pthread_cond_wait_common (abstime=0x0, clockid=0, mutex=0x7fffa4001120, cond=0x7fffa4001060) at ./nptl/pthread_cond_wait.c:503
#4  ___pthread_cond_wait (cond=0x7fffa4001060, mutex=0x7fffa4001120) at ./nptl/pthread_cond_wait.c:627
#5  0x000055555567f761 in std::_V2::condition_variable_any::wait<std::unique_lock<std::mutex>, coro::thread_pool::executor(std::stop_token, std::size_t)::<lambda()> > (__p=..., __stoken=..., __lock=..., this=<optimized out>) at /usr/include/c++/12/condition_variable:387
#6  coro::thread_pool::executor (this=0x7fffa4000fd0, stop_token=..., idx=1) at /home/bruno/Work/libcoro/src/thread_pool.cpp:108
#7  0x000055555567fb6c in operator() (__closure=<optimized out>, st=...) at /home/bruno/Work/libcoro/src/thread_pool.cpp:28
#8  std::__invoke_impl<void, coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> (__f=...) at /usr/include/c++/12/bits/invoke.h:61
#9  std::__invoke<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> (__fn=...) at /usr/include/c++/12/bits/invoke.h:96
#10 std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> >::_M_invoke<0, 1> (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:279
#11 std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> >::operator() (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:286
#12 std::thread::_State_impl<std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> > >::_M_run(void) (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:231
#13 0x00007ffff76e6363 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#14 0x00007ffff728f18a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
#15 0x00007ffff731dbd0 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 46 (Thread 0x7fff9f7fe6c0 (LWP 137813) "libcoro_test"):
#0  __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x7fffb000108c) at ./nptl/futex-internal.c:57
#1  __futex_abstimed_wait_common (cancel=true, private=0, abstime=0x0, clockid=0, expected=0, futex_word=0x7fffb000108c) at ./nptl/futex-internal.c:87
#2  __GI___futex_abstimed_wait_cancelable64 (futex_word=futex_word@entry=0x7fffb000108c, expected=expected@entry=0, clockid=clockid@entry=0, abstime=abstime@entry=0x0, private=private@entry=0) at ./nptl/futex-internal.c:139
#3  0x00007ffff728e0c8 in __pthread_cond_wait_common (abstime=0x0, clockid=0, mutex=0x7fffb0001120, cond=0x7fffb0001060) at ./nptl/pthread_cond_wait.c:503
#4  ___pthread_cond_wait (cond=0x7fffb0001060, mutex=0x7fffb0001120) at ./nptl/pthread_cond_wait.c:627
#5  0x000055555567f761 in std::_V2::condition_variable_any::wait<std::unique_lock<std::mutex>, coro::thread_pool::executor(std::stop_token, std::size_t)::<lambda()> > (__p=..., __stoken=..., __lock=..., this=<optimized out>) at /usr/include/c++/12/condition_variable:387
#6  coro::thread_pool::executor (this=0x7fffb0000fd0, stop_token=..., idx=3) at /home/bruno/Work/libcoro/src/thread_pool.cpp:108
#7  0x000055555567fb6c in operator() (__closure=<optimized out>, st=...) at /home/bruno/Work/libcoro/src/thread_pool.cpp:28
#8  std::__invoke_impl<void, coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> (__f=...) at /usr/include/c++/12/bits/invoke.h:61
#9  std::__invoke<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> (__fn=...) at /usr/include/c++/12/bits/invoke.h:96
#10 std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> >::_M_invoke<0, 1> (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:279
#11 std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> >::operator() (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:286
#12 std::thread::_State_impl<std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> > >::_M_run(void) (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:231
#13 0x00007ffff76e6363 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#14 0x00007ffff728f18a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
#15 0x00007ffff731dbd0 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 45 (Thread 0x7fff9ffff6c0 (LWP 137812) "libcoro_test"):
#0  __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x7fffb400108c) at ./nptl/futex-internal.c:57
#1  __futex_abstimed_wait_common (cancel=true, private=0, abstime=0x0, clockid=0, expected=0, futex_word=0x7fffb400108c) at ./nptl/futex-internal.c:87
#2  __GI___futex_abstimed_wait_cancelable64 (futex_word=futex_word@entry=0x7fffb400108c, expected=expected@entry=0, clockid=clockid@entry=0, abstime=abstime@entry=0x0, private=private@entry=0) at ./nptl/futex-internal.c:139
#3  0x00007ffff728e0c8 in __pthread_cond_wait_common (abstime=0x0, clockid=0, mutex=0x7fffb4001120, cond=0x7fffb4001060) at ./nptl/pthread_cond_wait.c:503
#4  ___pthread_cond_wait (cond=0x7fffb4001060, mutex=0x7fffb4001120) at ./nptl/pthread_cond_wait.c:627
#5  0x000055555567f761 in std::_V2::condition_variable_any::wait<std::unique_lock<std::mutex>, coro::thread_pool::executor(std::stop_token, std::size_t)::<lambda()> > (__p=..., __stoken=..., __lock=..., this=<optimized out>) at /usr/include/c++/12/condition_variable:387
#6  coro::thread_pool::executor (this=0x7fffb4000fd0, stop_token=..., idx=2) at /home/bruno/Work/libcoro/src/thread_pool.cpp:108
#7  0x000055555567fb6c in operator() (__closure=<optimized out>, st=...) at /home/bruno/Work/libcoro/src/thread_pool.cpp:28
#8  std::__invoke_impl<void, coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> (__f=...) at /usr/include/c++/12/bits/invoke.h:61
#9  std::__invoke<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> (__fn=...) at /usr/include/c++/12/bits/invoke.h:96
#10 std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> >::_M_invoke<0, 1> (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:279
#11 std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> >::operator() (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:286
#12 std::thread::_State_impl<std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> > >::_M_run(void) (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:231
#13 0x00007ffff76e6363 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#14 0x00007ffff728f18a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
#15 0x00007ffff731dbd0 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 44 (Thread 0x7fffc4ff96c0 (LWP 137811) "libcoro_test"):
#0  __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x7fffa800108c) at ./nptl/futex-internal.c:57
#1  __futex_abstimed_wait_common (cancel=true, private=0, abstime=0x0, clockid=0, expected=0, futex_word=0x7fffa800108c) at ./nptl/futex-internal.c:87
#2  __GI___futex_abstimed_wait_cancelable64 (futex_word=futex_word@entry=0x7fffa800108c, expected=expected@entry=0, clockid=clockid@entry=0, abstime=abstime@entry=0x0, private=private@entry=0) at ./nptl/futex-internal.c:139
#3  0x00007ffff728e0c8 in __pthread_cond_wait_common (abstime=0x0, clockid=0, mutex=0x7fffa8001120, cond=0x7fffa8001060) at ./nptl/pthread_cond_wait.c:503
#4  ___pthread_cond_wait (cond=0x7fffa8001060, mutex=0x7fffa8001120) at ./nptl/pthread_cond_wait.c:627
#5  0x000055555567f761 in std::_V2::condition_variable_any::wait<std::unique_lock<std::mutex>, coro::thread_pool::executor(std::stop_token, std::size_t)::<lambda()> > (__p=..., __stoken=..., __lock=..., this=<optimized out>) at /usr/include/c++/12/condition_variable:387
#6  coro::thread_pool::executor (this=0x7fffa8000fd0, stop_token=..., idx=1) at /home/bruno/Work/libcoro/src/thread_pool.cpp:108
#7  0x000055555567fb6c in operator() (__closure=<optimized out>, st=...) at /home/bruno/Work/libcoro/src/thread_pool.cpp:28
#8  std::__invoke_impl<void, coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> (__f=...) at /usr/include/c++/12/bits/invoke.h:61
#9  std::__invoke<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> (__fn=...) at /usr/include/c++/12/bits/invoke.h:96
#10 std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> >::_M_invoke<0, 1> (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:279
#11 std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> >::operator() (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:286
#12 std::thread::_State_impl<std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> > >::_M_run(void) (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:231
#13 0x00007ffff76e6363 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#14 0x00007ffff728f18a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
#15 0x00007ffff731dbd0 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 43 (Thread 0x7fff9e7fc6c0 (LWP 137814) "libcoro_test"):
#0  __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x7fffa400108c) at ./nptl/futex-internal.c:57
#1  __futex_abstimed_wait_common (cancel=true, private=0, abstime=0x0, clockid=0, expected=0, futex_word=0x7fffa400108c) at ./nptl/futex-internal.c:87
#2  __GI___futex_abstimed_wait_cancelable64 (futex_word=futex_word@entry=0x7fffa400108c, expected=expected@entry=0, clockid=clockid@entry=0, abstime=abstime@entry=0x0, private=private@entry=0) at ./nptl/futex-internal.c:139
#3  0x00007ffff728e0c8 in __pthread_cond_wait_common (abstime=0x0, clockid=0, mutex=0x7fffa4001120, cond=0x7fffa4001060) at ./nptl/pthread_cond_wait.c:503
#4  ___pthread_cond_wait (cond=0x7fffa4001060, mutex=0x7fffa4001120) at ./nptl/pthread_cond_wait.c:627
#5  0x000055555567f761 in std::_V2::condition_variable_any::wait<std::unique_lock<std::mutex>, coro::thread_pool::executor(std::stop_token, std::size_t)::<lambda()> > (__p=..., __stoken=..., __lock=..., this=<optimized out>) at /usr/include/c++/12/condition_variable:387
#6  coro::thread_pool::executor (this=0x7fffa4000fd0, stop_token=..., idx=0) at /home/bruno/Work/libcoro/src/thread_pool.cpp:108
#7  0x000055555567fb6c in operator() (__closure=<optimized out>, st=...) at /home/bruno/Work/libcoro/src/thread_pool.cpp:28
#8  std::__invoke_impl<void, coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> (__f=...) at /usr/include/c++/12/bits/invoke.h:61
#9  std::__invoke<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> (__fn=...) at /usr/include/c++/12/bits/invoke.h:96
#10 std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> >::_M_invoke<0, 1> (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:279
#11 std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> >::operator() (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:286
#12 std::thread::_State_impl<std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> > >::_M_run(void) (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:231
#13 0x00007ffff76e6363 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#14 0x00007ffff728f18a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
#15 0x00007ffff731dbd0 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 42 (Thread 0x7fff9effd6c0 (LWP 137810) "libcoro_test"):
#0  __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x7fff9effcc50) at ./nptl/futex-internal.c:57
#1  __futex_abstimed_wait_common (cancel=true, private=0, abstime=0x0, clockid=0, expected=0, futex_word=0x7fff9effcc50) at ./nptl/futex-internal.c:87
#2  __GI___futex_abstimed_wait_cancelable64 (futex_word=futex_word@entry=0x7fff9effcc50, expected=expected@entry=0, clockid=clockid@entry=0, abstime=abstime@entry=0x0, private=private@entry=0) at ./nptl/futex-internal.c:139
#3  0x00007ffff728e0c8 in __pthread_cond_wait_common (abstime=0x0, clockid=0, mutex=0x7fff9effcc00, cond=0x7fff9effcc28) at ./nptl/pthread_cond_wait.c:503
#4  ___pthread_cond_wait (cond=0x7fff9effcc28, mutex=0x7fff9effcc00) at ./nptl/pthread_cond_wait.c:627
#5  0x000055555567eab3 in std::condition_variable::wait<coro::detail::sync_wait_event::wait()::<lambda()> > (__p=..., __lock=..., this=0x7fff9effcc28) at /usr/include/c++/12/condition_variable:102
#6  coro::detail::sync_wait_event::wait (this=this@entry=0x7fff9effcc00) at /home/bruno/Work/libcoro/src/sync_wait.cpp:28
#7  0x00005555555c2716 in coro::sync_wait<coro::detail::when_all_ready_awaitable<std::vector<coro::detail::when_all_task<void>, std::allocator<coro::detail::when_all_task<void> > > > > (a=...) at /home/bruno/Work/libcoro/inc/coro/sync_wait.hpp:215
#8  0x00005555555c9c9a in operator() (__closure=<optimized out>) at /home/bruno/Work/libcoro/test/bench.cpp:532
#9  0x00007ffff76e6363 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#10 0x00007ffff728f18a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
#11 0x00007ffff731dbd0 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 41 (Thread 0x7fffc67fc6c0 (LWP 137806) "libcoro_test"):
#0  __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x7fffb0001088) at ./nptl/futex-internal.c:57
#1  __futex_abstimed_wait_common (cancel=true, private=0, abstime=0x0, clockid=0, expected=0, futex_word=0x7fffb0001088) at ./nptl/futex-internal.c:87
#2  __GI___futex_abstimed_wait_cancelable64 (futex_word=futex_word@entry=0x7fffb0001088, expected=expected@entry=0, clockid=clockid@entry=0, abstime=abstime@entry=0x0, private=private@entry=0) at ./nptl/futex-internal.c:139
#3  0x00007ffff728e0c8 in __pthread_cond_wait_common (abstime=0x0, clockid=0, mutex=0x7fffb0001120, cond=0x7fffb0001060) at ./nptl/pthread_cond_wait.c:503
#4  ___pthread_cond_wait (cond=0x7fffb0001060, mutex=0x7fffb0001120) at ./nptl/pthread_cond_wait.c:627
#5  0x000055555567f761 in std::_V2::condition_variable_any::wait<std::unique_lock<std::mutex>, coro::thread_pool::executor(std::stop_token, std::size_t)::<lambda()> > (__p=..., __stoken=..., __lock=..., this=<optimized out>) at /usr/include/c++/12/condition_variable:387
#6  coro::thread_pool::executor (this=0x7fffb0000fd0, stop_token=..., idx=2) at /home/bruno/Work/libcoro/src/thread_pool.cpp:108
#7  0x000055555567fb6c in operator() (__closure=<optimized out>, st=...) at /home/bruno/Work/libcoro/src/thread_pool.cpp:28
#8  std::__invoke_impl<void, coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> (__f=...) at /usr/include/c++/12/bits/invoke.h:61
#9  std::__invoke<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> (__fn=...) at /usr/include/c++/12/bits/invoke.h:96
#10 std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> >::_M_invoke<0, 1> (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:279
#11 std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> >::operator() (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:286
#12 std::thread::_State_impl<std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> > >::_M_run(void) (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:231
#13 0x00007ffff76e6363 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#14 0x00007ffff728f18a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
#15 0x00007ffff731dbd0 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 40 (Thread 0x7fffc6ffd6c0 (LWP 137807) "libcoro_test"):
#0  __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x7fffb400108c) at ./nptl/futex-internal.c:57
#1  __futex_abstimed_wait_common (cancel=true, private=0, abstime=0x0, clockid=0, expected=0, futex_word=0x7fffb400108c) at ./nptl/futex-internal.c:87
#2  __GI___futex_abstimed_wait_cancelable64 (futex_word=futex_word@entry=0x7fffb400108c, expected=expected@entry=0, clockid=clockid@entry=0, abstime=abstime@entry=0x0, private=private@entry=0) at ./nptl/futex-internal.c:139
#3  0x00007ffff728e0c8 in __pthread_cond_wait_common (abstime=0x0, clockid=0, mutex=0x7fffb4001120, cond=0x7fffb4001060) at ./nptl/pthread_cond_wait.c:503
#4  ___pthread_cond_wait (cond=0x7fffb4001060, mutex=0x7fffb4001120) at ./nptl/pthread_cond_wait.c:627
#5  0x000055555567f761 in std::_V2::condition_variable_any::wait<std::unique_lock<std::mutex>, coro::thread_pool::executor(std::stop_token, std::size_t)::<lambda()> > (__p=..., __stoken=..., __lock=..., this=<optimized out>) at /usr/include/c++/12/condition_variable:387
#6  coro::thread_pool::executor (this=0x7fffb4000fd0, stop_token=..., idx=1) at /home/bruno/Work/libcoro/src/thread_pool.cpp:108
#7  0x000055555567fb6c in operator() (__closure=<optimized out>, st=...) at /home/bruno/Work/libcoro/src/thread_pool.cpp:28
#8  std::__invoke_impl<void, coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> (__f=...) at /usr/include/c++/12/bits/invoke.h:61
#9  std::__invoke<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> (__fn=...) at /usr/include/c++/12/bits/invoke.h:96
#10 std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> >::_M_invoke<0, 1> (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:279
#11 std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> >::operator() (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:286
#12 std::thread::_State_impl<std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> > >::_M_run(void) (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:231
#13 0x00007ffff76e6363 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#14 0x00007ffff728f18a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
#15 0x00007ffff731dbd0 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 39 (Thread 0x7fffc57fa6c0 (LWP 137809) "libcoro_test"):
#0  __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x7fffa800108c) at ./nptl/futex-internal.c:57
#1  __futex_abstimed_wait_common (cancel=true, private=0, abstime=0x0, clockid=0, expected=0, futex_word=0x7fffa800108c) at ./nptl/futex-internal.c:87
#2  __GI___futex_abstimed_wait_cancelable64 (futex_word=futex_word@entry=0x7fffa800108c, expected=expected@entry=0, clockid=clockid@entry=0, abstime=abstime@entry=0x0, private=private@entry=0) at ./nptl/futex-internal.c:139
#3  0x00007ffff728e0c8 in __pthread_cond_wait_common (abstime=0x0, clockid=0, mutex=0x7fffa8001120, cond=0x7fffa8001060) at ./nptl/pthread_cond_wait.c:503
#4  ___pthread_cond_wait (cond=0x7fffa8001060, mutex=0x7fffa8001120) at ./nptl/pthread_cond_wait.c:627
#5  0x000055555567f761 in std::_V2::condition_variable_any::wait<std::unique_lock<std::mutex>, coro::thread_pool::executor(std::stop_token, std::size_t)::<lambda()> > (__p=..., __stoken=..., __lock=..., this=<optimized out>) at /usr/include/c++/12/condition_variable:387
#6  coro::thread_pool::executor (this=0x7fffa8000fd0, stop_token=..., idx=0) at /home/bruno/Work/libcoro/src/thread_pool.cpp:108
#7  0x000055555567fb6c in operator() (__closure=<optimized out>, st=...) at /home/bruno/Work/libcoro/src/thread_pool.cpp:28
#8  std::__invoke_impl<void, coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> (__f=...) at /usr/include/c++/12/bits/invoke.h:61
#9  std::__invoke<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> (__fn=...) at /usr/include/c++/12/bits/invoke.h:96
#10 std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> >::_M_invoke<0, 1> (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:279
#11 std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> >::operator() (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:286
#12 std::thread::_State_impl<std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> > >::_M_run(void) (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:231
#13 0x00007ffff76e6363 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#14 0x00007ffff728f18a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
#15 0x00007ffff731dbd0 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 38 (Thread 0x7fffc5ffb6c0 (LWP 137808) "libcoro_test"):
#0  __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x7fffc5ffac50) at ./nptl/futex-internal.c:57
#1  __futex_abstimed_wait_common (cancel=true, private=0, abstime=0x0, clockid=0, expected=0, futex_word=0x7fffc5ffac50) at ./nptl/futex-internal.c:87
#2  __GI___futex_abstimed_wait_cancelable64 (futex_word=futex_word@entry=0x7fffc5ffac50, expected=expected@entry=0, clockid=clockid@entry=0, abstime=abstime@entry=0x0, private=private@entry=0) at ./nptl/futex-internal.c:139
#3  0x00007ffff728e0c8 in __pthread_cond_wait_common (abstime=0x0, clockid=0, mutex=0x7fffc5ffac00, cond=0x7fffc5ffac28) at ./nptl/pthread_cond_wait.c:503
#4  ___pthread_cond_wait (cond=0x7fffc5ffac28, mutex=0x7fffc5ffac00) at ./nptl/pthread_cond_wait.c:627
#5  0x000055555567eab3 in std::condition_variable::wait<coro::detail::sync_wait_event::wait()::<lambda()> > (__p=..., __lock=..., this=0x7fffc5ffac28) at /usr/include/c++/12/condition_variable:102
#6  coro::detail::sync_wait_event::wait (this=this@entry=0x7fffc5ffac00) at /home/bruno/Work/libcoro/src/sync_wait.cpp:28
#7  0x00005555555c2716 in coro::sync_wait<coro::detail::when_all_ready_awaitable<std::vector<coro::detail::when_all_task<void>, std::allocator<coro::detail::when_all_task<void> > > > > (a=...) at /home/bruno/Work/libcoro/inc/coro/sync_wait.hpp:215
#8  0x00005555555c9c9a in operator() (__closure=<optimized out>) at /home/bruno/Work/libcoro/test/bench.cpp:532
#9  0x00007ffff76e6363 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#10 0x00007ffff728f18a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
#11 0x00007ffff731dbd0 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 37 (Thread 0x7fffccff96c0 (LWP 137803) "libcoro_test"):
#0  __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x7fffb0001088) at ./nptl/futex-internal.c:57
#1  __futex_abstimed_wait_common (cancel=true, private=0, abstime=0x0, clockid=0, expected=0, futex_word=0x7fffb0001088) at ./nptl/futex-internal.c:87
#2  __GI___futex_abstimed_wait_cancelable64 (futex_word=futex_word@entry=0x7fffb0001088, expected=expected@entry=0, clockid=clockid@entry=0, abstime=abstime@entry=0x0, private=private@entry=0) at ./nptl/futex-internal.c:139
#3  0x00007ffff728e0c8 in __pthread_cond_wait_common (abstime=0x0, clockid=0, mutex=0x7fffb0001120, cond=0x7fffb0001060) at ./nptl/pthread_cond_wait.c:503
#4  ___pthread_cond_wait (cond=0x7fffb0001060, mutex=0x7fffb0001120) at ./nptl/pthread_cond_wait.c:627
#5  0x000055555567f761 in std::_V2::condition_variable_any::wait<std::unique_lock<std::mutex>, coro::thread_pool::executor(std::stop_token, std::size_t)::<lambda()> > (__p=..., __stoken=..., __lock=..., this=<optimized out>) at /usr/include/c++/12/condition_variable:387
#6  coro::thread_pool::executor (this=0x7fffb0000fd0, stop_token=..., idx=1) at /home/bruno/Work/libcoro/src/thread_pool.cpp:108
#7  0x000055555567fb6c in operator() (__closure=<optimized out>, st=...) at /home/bruno/Work/libcoro/src/thread_pool.cpp:28
#8  std::__invoke_impl<void, coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> (__f=...) at /usr/include/c++/12/bits/invoke.h:61
#9  std::__invoke<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> (__fn=...) at /usr/include/c++/12/bits/invoke.h:96
#10 std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> >::_M_invoke<0, 1> (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:279
#11 std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> >::operator() (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:286
#12 std::thread::_State_impl<std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> > >::_M_run(void) (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:231
#13 0x00007ffff76e6363 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#14 0x00007ffff728f18a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
#15 0x00007ffff731dbd0 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 36 (Thread 0x7fffc77fe6c0 (LWP 137805) "libcoro_test"):
#0  __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x7fffb400108c) at ./nptl/futex-internal.c:57
#1  __futex_abstimed_wait_common (cancel=true, private=0, abstime=0x0, clockid=0, expected=0, futex_word=0x7fffb400108c) at ./nptl/futex-internal.c:87
#2  __GI___futex_abstimed_wait_cancelable64 (futex_word=futex_word@entry=0x7fffb400108c, expected=expected@entry=0, clockid=clockid@entry=0, abstime=abstime@entry=0x0, private=private@entry=0) at ./nptl/futex-internal.c:139
#3  0x00007ffff728e0c8 in __pthread_cond_wait_common (abstime=0x0, clockid=0, mutex=0x7fffb4001120, cond=0x7fffb4001060) at ./nptl/pthread_cond_wait.c:503
#4  ___pthread_cond_wait (cond=0x7fffb4001060, mutex=0x7fffb4001120) at ./nptl/pthread_cond_wait.c:627
#5  0x000055555567f761 in std::_V2::condition_variable_any::wait<std::unique_lock<std::mutex>, coro::thread_pool::executor(std::stop_token, std::size_t)::<lambda()> > (__p=..., __stoken=..., __lock=..., this=<optimized out>) at /usr/include/c++/12/condition_variable:387
#6  coro::thread_pool::executor (this=0x7fffb4000fd0, stop_token=..., idx=0) at /home/bruno/Work/libcoro/src/thread_pool.cpp:108
#7  0x000055555567fb6c in operator() (__closure=<optimized out>, st=...) at /home/bruno/Work/libcoro/src/thread_pool.cpp:28
#8  std::__invoke_impl<void, coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> (__f=...) at /usr/include/c++/12/bits/invoke.h:61
#9  std::__invoke<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> (__fn=...) at /usr/include/c++/12/bits/invoke.h:96
#10 std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> >::_M_invoke<0, 1> (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:279
#11 std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> >::operator() (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:286
#12 std::thread::_State_impl<std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> > >::_M_run(void) (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:231
#13 0x00007ffff76e6363 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#14 0x00007ffff728f18a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
#15 0x00007ffff731dbd0 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 35 (Thread 0x7fffc7fff6c0 (LWP 137804) "libcoro_test"):
#0  __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x7fffc7ffec50) at ./nptl/futex-internal.c:57
#1  __futex_abstimed_wait_common (cancel=true, private=0, abstime=0x0, clockid=0, expected=0, futex_word=0x7fffc7ffec50) at ./nptl/futex-internal.c:87
#2  __GI___futex_abstimed_wait_cancelable64 (futex_word=futex_word@entry=0x7fffc7ffec50, expected=expected@entry=0, clockid=clockid@entry=0, abstime=abstime@entry=0x0, private=private@entry=0) at ./nptl/futex-internal.c:139
#3  0x00007ffff728e0c8 in __pthread_cond_wait_common (abstime=0x0, clockid=0, mutex=0x7fffc7ffec00, cond=0x7fffc7ffec28) at ./nptl/pthread_cond_wait.c:503
#4  ___pthread_cond_wait (cond=0x7fffc7ffec28, mutex=0x7fffc7ffec00) at ./nptl/pthread_cond_wait.c:627
#5  0x000055555567eab3 in std::condition_variable::wait<coro::detail::sync_wait_event::wait()::<lambda()> > (__p=..., __lock=..., this=0x7fffc7ffec28) at /usr/include/c++/12/condition_variable:102
#6  coro::detail::sync_wait_event::wait (this=this@entry=0x7fffc7ffec00) at /home/bruno/Work/libcoro/src/sync_wait.cpp:28
#7  0x00005555555c2716 in coro::sync_wait<coro::detail::when_all_ready_awaitable<std::vector<coro::detail::when_all_task<void>, std::allocator<coro::detail::when_all_task<void> > > > > (a=...) at /home/bruno/Work/libcoro/inc/coro/sync_wait.hpp:215
#8  0x00005555555c9c9a in operator() (__closure=<optimized out>) at /home/bruno/Work/libcoro/test/bench.cpp:532
#9  0x00007ffff76e6363 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#10 0x00007ffff728f18a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
#11 0x00007ffff731dbd0 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 34 (Thread 0x7fffcd7fa6c0 (LWP 137802) "libcoro_test"):
#0  __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x7fffb0001088) at ./nptl/futex-internal.c:57
#1  __futex_abstimed_wait_common (cancel=true, private=0, abstime=0x0, clockid=0, expected=0, futex_word=0x7fffb0001088) at ./nptl/futex-internal.c:87
#2  __GI___futex_abstimed_wait_cancelable64 (futex_word=futex_word@entry=0x7fffb0001088, expected=expected@entry=0, clockid=clockid@entry=0, abstime=abstime@entry=0x0, private=private@entry=0) at ./nptl/futex-internal.c:139
#3  0x00007ffff728e0c8 in __pthread_cond_wait_common (abstime=0x0, clockid=0, mutex=0x7fffb0001120, cond=0x7fffb0001060) at ./nptl/pthread_cond_wait.c:503
#4  ___pthread_cond_wait (cond=0x7fffb0001060, mutex=0x7fffb0001120) at ./nptl/pthread_cond_wait.c:627
#5  0x000055555567f761 in std::_V2::condition_variable_any::wait<std::unique_lock<std::mutex>, coro::thread_pool::executor(std::stop_token, std::size_t)::<lambda()> > (__p=..., __stoken=..., __lock=..., this=<optimized out>) at /usr/include/c++/12/condition_variable:387
#6  coro::thread_pool::executor (this=0x7fffb0000fd0, stop_token=..., idx=0) at /home/bruno/Work/libcoro/src/thread_pool.cpp:108
#7  0x000055555567fb6c in operator() (__closure=<optimized out>, st=...) at /home/bruno/Work/libcoro/src/thread_pool.cpp:28
#8  std::__invoke_impl<void, coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> (__f=...) at /usr/include/c++/12/bits/invoke.h:61
#9  std::__invoke<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> (__fn=...) at /usr/include/c++/12/bits/invoke.h:96
#10 std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> >::_M_invoke<0, 1> (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:279
#11 std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> >::operator() (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:286
#12 std::thread::_State_impl<std::thread::_Invoker<std::tuple<coro::thread_pool::thread_pool(options)::<lambda(std::stop_token)>, std::stop_token> > >::_M_run(void) (this=<optimized out>) at /usr/include/c++/12/bits/std_thread.h:231
#13 0x00007ffff76e6363 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#14 0x00007ffff728f18a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
#15 0x00007ffff731dbd0 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 33 (Thread 0x7fffcdffb6c0 (LWP 137801) "libcoro_test"):
#0  __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x7fffcdffac50) at ./nptl/futex-internal.c:57
#1  __futex_abstimed_wait_common (cancel=true, private=0, abstime=0x0, clockid=0, expected=0, futex_word=0x7fffcdffac50) at ./nptl/futex-internal.c:87
#2  __GI___futex_abstimed_wait_cancelable64 (futex_word=futex_word@entry=0x7fffcdffac50, expected=expected@entry=0, clockid=clockid@entry=0, abstime=abstime@entry=0x0, private=private@entry=0) at ./nptl/futex-internal.c:139
#3  0x00007ffff728e0c8 in __pthread_cond_wait_common (abstime=0x0, clockid=0, mutex=0x7fffcdffac00, cond=0x7fffcdffac28) at ./nptl/pthread_cond_wait.c:503
#4  ___pthread_cond_wait (cond=0x7fffcdffac28, mutex=0x7fffcdffac00) at ./nptl/pthread_cond_wait.c:627
#5  0x000055555567eab3 in std::condition_variable::wait<coro::detail::sync_wait_event::wait()::<lambda()> > (__p=..., __lock=..., this=0x7fffcdffac28) at /usr/include/c++/12/condition_variable:102
#6  coro::detail::sync_wait_event::wait (this=this@entry=0x7fffcdffac00) at /home/bruno/Work/libcoro/src/sync_wait.cpp:28
#7  0x00005555555c2716 in coro::sync_wait<coro::detail::when_all_ready_awaitable<std::vector<coro::detail::when_all_task<void>, std::allocator<coro::detail::when_all_task<void> > > > > (a=...) at /home/bruno/Work/libcoro/inc/coro/sync_wait.hpp:215
#8  0x00005555555c9c9a in operator() (__closure=<optimized out>) at /home/bruno/Work/libcoro/test/bench.cpp:532
#9  0x00007ffff76e6363 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#10 0x00007ffff728f18a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
#11 0x00007ffff731dbd0 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 32 (Thread 0x7fffce7fc6c0 (LWP 137800) "libcoro_test"):
#0  __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x7fffce7fbc50) at ./nptl/futex-internal.c:57
#1  __futex_abstimed_wait_common (cancel=true, private=0, abstime=0x0, clockid=0, expected=0, futex_word=0x7fffce7fbc50) at ./nptl/futex-internal.c:87
#2  __GI___futex_abstimed_wait_cancelable64 (futex_word=futex_word@entry=0x7fffce7fbc50, expected=expected@entry=0, clockid=clockid@entry=0, abstime=abstime@entry=0x0, private=private@entry=0) at ./nptl/futex-internal.c:139
#3  0x00007ffff728e0c8 in __pthread_cond_wait_common (abstime=0x0, clockid=0, mutex=0x7fffce7fbc00, cond=0x7fffce7fbc28) at ./nptl/pthread_cond_wait.c:503
#4  ___pthread_cond_wait (cond=0x7fffce7fbc28, mutex=0x7fffce7fbc00) at ./nptl/pthread_cond_wait.c:627
#5  0x000055555567eab3 in std::condition_variable::wait<coro::detail::sync_wait_event::wait()::<lambda()> > (__p=..., __lock=..., this=0x7fffce7fbc28) at /usr/include/c++/12/condition_variable:102
#6  coro::detail::sync_wait_event::wait (this=this@entry=0x7fffce7fbc00) at /home/bruno/Work/libcoro/src/sync_wait.cpp:28
#7  0x00005555555c2716 in coro::sync_wait<coro::detail::when_all_ready_awaitable<std::vector<coro::detail::when_all_task<void>, std::allocator<coro::detail::when_all_task<void> > > > > (a=...) at /home/bruno/Work/libcoro/inc/coro/sync_wait.hpp:215
#8  0x00005555555c9c9a in operator() (__closure=<optimized out>) at /home/bruno/Work/libcoro/test/bench.cpp:532
#9  0x00007ffff76e6363 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#10 0x00007ffff728f18a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
#11 0x00007ffff731dbd0 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 31 (Thread 0x7fffceffd6c0 (LWP 137799) "libcoro_test"):
#0  0x00007ffff731dff6 in epoll_wait (epfd=19, events=0x7fffd8000cf0, maxevents=16, timeout=1000) at ../sysdeps/unix/sysv/linux/epoll_wait.c:30
#1  0x0000555555681af1 in coro::io_scheduler::process_events_execute (this=this@entry=0x7fffd8000b80, timeout=..., timeout@entry=std::chrono::duration = { 1000ms }) at /home/bruno/Work/libcoro/src/io_scheduler.cpp:238
#2  0x00005555556820af in coro::io_scheduler::process_events_dedicated_thread (this=0x7fffd8000b80) at /home/bruno/Work/libcoro/src/io_scheduler.cpp:226
#3  0x00007ffff76e6363 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#4  0x00007ffff728f18a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
#5  0x00007ffff731dbd0 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 30 (Thread 0x7fffcf7fe6c0 (LWP 137798) "libcoro_test"):
#0  0x00007ffff731dff6 in epoll_wait (epfd=15, events=0x7fffe0000cf0, maxevents=16, timeout=1000) at ../sysdeps/unix/sysv/linux/epoll_wait.c:30
#1  0x0000555555681af1 in coro::io_scheduler::process_events_execute (this=this@entry=0x7fffe0000b80, timeout=..., timeout@entry=std::chrono::duration = { 1000ms }) at /home/bruno/Work/libcoro/src/io_scheduler.cpp:238
#2  0x00005555556820af in coro::io_scheduler::process_events_dedicated_thread (this=0x7fffe0000b80) at /home/bruno/Work/libcoro/src/io_scheduler.cpp:226
#3  0x00007ffff76e6363 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#4  0x00007ffff728f18a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
#5  0x00007ffff731dbd0 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 28 (Thread 0x7fffd4ff96c0 (LWP 137796) "libcoro_test"):
#0  0x00007ffff731dff6 in epoll_wait (epfd=7, events=0x7fffe8000cf0, maxevents=16, timeout=1000) at ../sysdeps/unix/sysv/linux/epoll_wait.c:30
#1  0x0000555555681af1 in coro::io_scheduler::process_events_execute (this=this@entry=0x7fffe8000b80, timeout=..., timeout@entry=std::chrono::duration = { 1000ms }) at /home/bruno/Work/libcoro/src/io_scheduler.cpp:238
#2  0x00005555556820af in coro::io_scheduler::process_events_dedicated_thread (this=0x7fffe8000b80) at /home/bruno/Work/libcoro/src/io_scheduler.cpp:226
#3  0x00007ffff76e6363 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#4  0x00007ffff728f18a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
#5  0x00007ffff731dbd0 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 27 (Thread 0x7fffd57fa6c0 (LWP 137795) "libcoro_test"):
#0  0x00007ffff731dff6 in epoll_wait (epfd=11, events=0x7fffec000cf0, maxevents=16, timeout=1000) at ../sysdeps/unix/sysv/linux/epoll_wait.c:30
#1  0x0000555555681af1 in coro::io_scheduler::process_events_execute (this=this@entry=0x7fffec000b80, timeout=..., timeout@entry=std::chrono::duration = { 1000ms }) at /home/bruno/Work/libcoro/src/io_scheduler.cpp:238
#2  0x00005555556820af in coro::io_scheduler::process_events_dedicated_thread (this=0x7fffec000b80) at /home/bruno/Work/libcoro/src/io_scheduler.cpp:226
#3  0x00007ffff76e6363 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#4  0x00007ffff728f18a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
#5  0x00007ffff731dbd0 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 24 (Thread 0x7fffd6ffd6c0 (LWP 137788) "libcoro_test"):
#0  0x00007ffff731dff6 in epoll_wait (epfd=3, events=0x7ffff0000cf0, maxevents=16, timeout=1000) at ../sysdeps/unix/sysv/linux/epoll_wait.c:30
#1  0x0000555555681af1 in coro::io_scheduler::process_events_execute (this=this@entry=0x7ffff0000b80, timeout=..., timeout@entry=std::chrono::duration = { 1000ms }) at /home/bruno/Work/libcoro/src/io_scheduler.cpp:238
#2  0x00005555556820af in coro::io_scheduler::process_events_dedicated_thread (this=0x7ffff0000b80) at /home/bruno/Work/libcoro/src/io_scheduler.cpp:226
#3  0x00007ffff76e6363 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#4  0x00007ffff728f18a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
#5  0x00007ffff731dbd0 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 10 (Thread 0x7fffdffff6c0 (LWP 137781) "libcoro_test"):
#0  __futex_abstimed_wait_common64 (private=128, cancel=true, abstime=0x0, op=265, expected=137799, futex_word=0x7fffceffd990) at ./nptl/futex-internal.c:57
#1  __futex_abstimed_wait_common (cancel=true, private=128, abstime=0x0, clockid=0, expected=137799, futex_word=0x7fffceffd990) at ./nptl/futex-internal.c:87
#2  __GI___futex_abstimed_wait_cancelable64 (futex_word=futex_word@entry=0x7fffceffd990, expected=137799, clockid=clockid@entry=0, abstime=abstime@entry=0x0, private=private@entry=128) at ./nptl/futex-internal.c:139
#3  0x00007ffff7290c73 in __pthread_clockjoin_ex (threadid=140736666261184, thread_return=0x0, clockid=0, abstime=0x0, block=<optimized out>) at ./nptl/pthread_join_common.c:102
#4  0x00007ffff76e63d7 in std::thread::join() () from /lib/x86_64-linux-gnu/libstdc++.so.6
#5  0x0000555555680bbc in coro::io_scheduler::shutdown (this=0x7fffd8000b80) at /home/bruno/Work/libcoro/src/io_scheduler.cpp:200
#6  coro::io_scheduler::shutdown (this=0x7fffd8000b80) at /home/bruno/Work/libcoro/src/io_scheduler.cpp:183
#7  0x00005555555c491c in operator() (__closure=0x5555556ff2a8) at /usr/include/c++/12/bits/shared_ptr_base.h:1665
#8  0x00007ffff76e6363 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#9  0x00007ffff728f18a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
#10 0x00007ffff731dbd0 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 8 (Thread 0x7fffe7fff6c0 (LWP 137776) "libcoro_test"):
#0  __futex_abstimed_wait_common64 (private=128, cancel=true, abstime=0x0, op=265, expected=137798, futex_word=0x7fffcf7fe990) at ./nptl/futex-internal.c:57
#1  __futex_abstimed_wait_common (cancel=true, private=128, abstime=0x0, clockid=0, expected=137798, futex_word=0x7fffcf7fe990) at ./nptl/futex-internal.c:87
#2  __GI___futex_abstimed_wait_cancelable64 (futex_word=futex_word@entry=0x7fffcf7fe990, expected=137798, clockid=clockid@entry=0, abstime=abstime@entry=0x0, private=private@entry=128) at ./nptl/futex-internal.c:139
#3  0x00007ffff7290c73 in __pthread_clockjoin_ex (threadid=140736674653888, thread_return=0x0, clockid=0, abstime=0x0, block=<optimized out>) at ./nptl/pthread_join_common.c:102
#4  0x00007ffff76e63d7 in std::thread::join() () from /lib/x86_64-linux-gnu/libstdc++.so.6
#5  0x0000555555680bbc in coro::io_scheduler::shutdown (this=0x7fffe0000b80) at /home/bruno/Work/libcoro/src/io_scheduler.cpp:200
#6  coro::io_scheduler::shutdown (this=0x7fffe0000b80) at /home/bruno/Work/libcoro/src/io_scheduler.cpp:183
#7  0x00005555555c491c in operator() (__closure=0x5555556fc798) at /usr/include/c++/12/bits/shared_ptr_base.h:1665
#8  0x00007ffff76e6363 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#9  0x00007ffff728f18a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
#10 0x00007ffff731dbd0 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 5 (Thread 0x7ffff59fc6c0 (LWP 137773) "libcoro_test"):
#0  __futex_abstimed_wait_common64 (private=128, cancel=true, abstime=0x0, op=265, expected=137795, futex_word=0x7fffd57fa990) at ./nptl/futex-internal.c:57
#1  __futex_abstimed_wait_common (cancel=true, private=128, abstime=0x0, clockid=0, expected=137795, futex_word=0x7fffd57fa990) at ./nptl/futex-internal.c:87
#2  __GI___futex_abstimed_wait_cancelable64 (futex_word=futex_word@entry=0x7fffd57fa990, expected=137795, clockid=clockid@entry=0, abstime=abstime@entry=0x0, private=private@entry=128) at ./nptl/futex-internal.c:139
#3  0x00007ffff7290c73 in __pthread_clockjoin_ex (threadid=140736775300800, thread_return=0x0, clockid=0, abstime=0x0, block=<optimized out>) at ./nptl/pthread_join_common.c:102
#4  0x00007ffff76e63d7 in std::thread::join() () from /lib/x86_64-linux-gnu/libstdc++.so.6
#5  0x0000555555680bbc in coro::io_scheduler::shutdown (this=0x7fffec000b80) at /home/bruno/Work/libcoro/src/io_scheduler.cpp:200
#6  coro::io_scheduler::shutdown (this=0x7fffec000b80) at /home/bruno/Work/libcoro/src/io_scheduler.cpp:183
#7  0x00005555555c491c in operator() (__closure=0x555555702758) at /usr/include/c++/12/bits/shared_ptr_base.h:1665
#8  0x00007ffff76e6363 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#9  0x00007ffff728f18a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
#10 0x00007ffff731dbd0 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 3 (Thread 0x7ffff69fe6c0 (LWP 137771) "libcoro_test"):
#0  __futex_abstimed_wait_common64 (private=128, cancel=true, abstime=0x0, op=265, expected=137796, futex_word=0x7fffd4ff9990) at ./nptl/futex-internal.c:57
#1  __futex_abstimed_wait_common (cancel=true, private=128, abstime=0x0, clockid=0, expected=137796, futex_word=0x7fffd4ff9990) at ./nptl/futex-internal.c:87
#2  __GI___futex_abstimed_wait_cancelable64 (futex_word=futex_word@entry=0x7fffd4ff9990, expected=137796, clockid=clockid@entry=0, abstime=abstime@entry=0x0, private=private@entry=128) at ./nptl/futex-internal.c:139
#3  0x00007ffff7290c73 in __pthread_clockjoin_ex (threadid=140736766908096, thread_return=0x0, clockid=0, abstime=0x0, block=<optimized out>) at ./nptl/pthread_join_common.c:102
#4  0x00007ffff76e63d7 in std::thread::join() () from /lib/x86_64-linux-gnu/libstdc++.so.6
#5  0x0000555555680bbc in coro::io_scheduler::shutdown (this=0x7fffe8000b80) at /home/bruno/Work/libcoro/src/io_scheduler.cpp:200
#6  coro::io_scheduler::shutdown (this=0x7fffe8000b80) at /home/bruno/Work/libcoro/src/io_scheduler.cpp:183
#7  0x00005555555c491c in operator() (__closure=0x5555556fca58) at /usr/include/c++/12/bits/shared_ptr_base.h:1665
#8  0x00007ffff76e6363 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#9  0x00007ffff728f18a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
#10 0x00007ffff731dbd0 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 2 (Thread 0x7ffff71ff6c0 (LWP 137770) "libcoro_test"):
#0  __futex_abstimed_wait_common64 (private=128, cancel=true, abstime=0x0, op=265, expected=137788, futex_word=0x7fffd6ffd990) at ./nptl/futex-internal.c:57
#1  __futex_abstimed_wait_common (cancel=true, private=128, abstime=0x0, clockid=0, expected=137788, futex_word=0x7fffd6ffd990) at ./nptl/futex-internal.c:87
#2  __GI___futex_abstimed_wait_cancelable64 (futex_word=futex_word@entry=0x7fffd6ffd990, expected=137788, clockid=clockid@entry=0, abstime=abstime@entry=0x0, private=private@entry=128) at ./nptl/futex-internal.c:139
#3  0x00007ffff7290c73 in __pthread_clockjoin_ex (threadid=140736800478912, thread_return=0x0, clockid=0, abstime=0x0, block=<optimized out>) at ./nptl/pthread_join_common.c:102
#4  0x00007ffff76e63d7 in std::thread::join() () from /lib/x86_64-linux-gnu/libstdc++.so.6
#5  0x0000555555680bbc in coro::io_scheduler::shutdown (this=0x7ffff0000b80) at /home/bruno/Work/libcoro/src/io_scheduler.cpp:200
#6  coro::io_scheduler::shutdown (this=0x7ffff0000b80) at /home/bruno/Work/libcoro/src/io_scheduler.cpp:183
#7  0x00005555555c491c in operator() (__closure=0x5555556fc3c8) at /usr/include/c++/12/bits/shared_ptr_base.h:1665
#8  0x00007ffff76e6363 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#9  0x00007ffff728f18a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:444
#10 0x00007ffff731dbd0 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 1 (Thread 0x7ffff7ee1740 (LWP 137756) "libcoro_test"):
#0  __futex_abstimed_wait_common64 (private=128, cancel=true, abstime=0x0, op=265, expected=137800, futex_word=0x7fffce7fc990) at ./nptl/futex-internal.c:57
#1  __futex_abstimed_wait_common (cancel=true, private=128, abstime=0x0, clockid=0, expected=137800, futex_word=0x7fffce7fc990) at ./nptl/futex-internal.c:87
#2  __GI___futex_abstimed_wait_cancelable64 (futex_word=futex_word@entry=0x7fffce7fc990, expected=137800, clockid=clockid@entry=0, abstime=abstime@entry=0x0, private=private@entry=128) at ./nptl/futex-internal.c:139
#3  0x00007ffff7290c73 in __pthread_clockjoin_ex (threadid=140736657868480, thread_return=0x0, clockid=0, abstime=0x0, block=<optimized out>) at ./nptl/pthread_join_common.c:102
#4  0x00007ffff76e63d7 in std::thread::join() () from /lib/x86_64-linux-gnu/libstdc++.so.6
#5  0x00005555555caec8 in CATCH2_INTERNAL_TEST_20 () at /home/bruno/Work/libcoro/test/bench.cpp:539
#6  0x000055555560487d in Catch::TestInvokerAsFunction::invoke (this=<optimized out>) at /home/bruno/Work/libcoro/test/catch_amalgamated.cpp:6156
#7  Catch::TestCaseHandle::invoke (this=<optimized out>) at /home/bruno/Work/libcoro/test/catch_amalgamated.hpp:7265
#8  Catch::RunContext::invokeActiveTestCase (this=0x7fffffffdf30) at /home/bruno/Work/libcoro/test/catch_amalgamated.cpp:5500
#9  0x0000555555637990 in Catch::RunContext::runCurrentTest (this=this@entry=0x7fffffffdf30, redirectedCout="", redirectedCerr="") at /home/bruno/Work/libcoro/test/catch_amalgamated.cpp:5463
#10 0x0000555555637c5c in Catch::RunContext::runTest (this=this@entry=0x7fffffffdf30, testCase=...) at /home/bruno/Work/libcoro/test/catch_amalgamated.cpp:5194
#11 0x000055555563c612 in Catch::(anonymous namespace)::TestGroup::execute (this=0x7fffffffdf20) at /home/bruno/Work/libcoro/test/catch_amalgamated.cpp:1021
#12 Catch::Session::runInternal (this=this@entry=0x7fffffffe1c0) at /home/bruno/Work/libcoro/test/catch_amalgamated.cpp:1243
#13 0x000055555563c9ae in Catch::Session::run (this=this@entry=0x7fffffffe1c0) at /home/bruno/Work/libcoro/test/catch_amalgamated.cpp:1174
#14 0x00005555555c06eb in Catch::Session::run<char> (argv=0x7fffffffe488, argc=2, this=0x7fffffffe1c0) at /home/bruno/Work/libcoro/test/catch_amalgamated.hpp:5320
#15 Catch::Session::run<char> (argv=0x7fffffffe488, argc=2, this=0x7fffffffe1c0) at /home/bruno/Work/libcoro/test/catch_amalgamated.hpp:5315
#16 main (argc=2, argv=0x7fffffffe488) at /home/bruno/Work/libcoro/test/catch_amalgamated.cpp:4372

Yeah I believe this is the old #94 problem which I've not really ever had time to tackle.

Regarding clang it should be merged into main now via #187

Cool. I'll merge into my WASM branch and get a PR out in the next few days.

I've just got onto this and I checked out your updated main on ubuntu to rebase my wasm tweaks onto. It won't build with clang due to the dependency on catch2 that tl::expected brings. I get the following errors building it out of the box.

/home/bruno/Work/libcoro/Debug-Clang/_deps/catch2-src/src/catch2/../catch2/internal/catch_string_manip.hpp:47:14: error: no type named 'uint64_t' in namespace 'std'
        std::uint64_t m_count;
        ~~~~~^

In my attempt to support clang, I avoided that by copying the single header in tl::expected into the repo. Mind if I do that? I'm going to work on getting WASM building based on your latest main regardless.

In ci.yml you can see how we got it building on Linux, specifically Ubuntu, thus far.

I'm not sure with #145 merged that you can just copy it in anymore.

The steps in ci.yml worked, not quite sure what I was doing different. Regardless, I'll have a go at getting a wasm build working.

Awesome! Glad it worked for you.

I've just put up a PR to get it to build to WASM via em++. Basically tweaking a few bits. Most of the work I'd done to get my original WASM build going were redone in the clang support PR. I still had to conditionally flip to std::thread from std::jthread as they aren' t supported in em++ yet

I'll close the issue and open separate wasm issue