Skip to content

test, docs: teardown destroys every frame before any service - #401

Merged
sgerbino merged 3 commits into
cppalliance:developfrom
sgerbino:pr/shutdown-once
Oct 21, 2026
Merged

sgerbino merged 3 commits into
cppalliance:developfrom
sgerbino:pr/shutdown-once

Conversation

@sgerbino

Copy link
Copy Markdown
Collaborator

Problem

Destroying an io_context was correct only because the timer service is created before the scheduler. Work left for the scheduler's last drain can reach an I/O object whose service is already gone. Nothing stated or tested which work may reach that drain.

Change

  • Every service gives up all its work in shutdown() and posts nothing from its destructor. An audit of every service, on every backend, found none that posts from its destructor, so no service code changes.
  • The last drain in the scheduler destructors stays as a backstop for work posted after the shutdown drain. Their comments now say so.
  • The io_context destructor note, the I/O context guide and the lifetime design note state the rule.

Creating the timer service with the first timer, which removes its ordering special case, follows in a separate PR.

Testing

testShutdownDestroysFramesBeforeServices parks chains on a timer, a socket read, an accept and a signal wait, in frames that hold or own their I/O objects, on a strand, and on POSIX behind a blocking-pool worker (not on io_uring, which reads files through the ring). A service created last, and so destroyed first, checks that every frame is already gone when the services begin to go.

Paired with cppalliance/capy#463.

Resolves #399

@cppalliance-bot

cppalliance-bot commented Oct 19, 2026 •

Copy link
Copy Markdown

An automated preview of the documentation is available at https://401.corosio.prtest3.cppalliance.org/index.html

If more commits are pushed to the pull request, the docs will rebuild at the same URL.

2026-10-20 22:29:40 UTC

@cppalliance-bot

cppalliance-bot commented Oct 19, 2026 •

Copy link
Copy Markdown

GCOVR code coverage report https://401.corosio.prtest3.cppalliance.org/gcovr/index.html
LCOV code coverage report https://401.corosio.prtest3.cppalliance.org/genhtml/index.html
Coverage Diff Report https://401.corosio.prtest3.cppalliance.org/diff-report/index.html

Build time: 2026-10-20 22:42:56 UTC

@github-actions

github-actions Bot commented Oct 19, 2026 •

Copy link
Copy Markdown

Benchmark report

280074acf68b (base) vs 3b6e734fcc11 (head)

  • ✅ linux — clean (epoll, uring)
  • ✅ windows — clean (iocp)
  • ✅ macos — clean (kqueue)
linux — full results (226 benchmarks, 5 iterations, 1.5s each)

accept_churn

Benchmark Backend Metric Base Head Δ Noise
burst/10 epoll ops_per_sec 1.89K ops/s 1.88K ops/s 🔴▼ -0.88% 0.77%
burst/10 uring ops_per_sec 1.80K ops/s 1.79K ops/s 🔴▼ -1.56% 1.07%
burst/100 epoll ops_per_sec 191.4 ops/s 190.2 ops/s 🔴▼ -0.60% 0.75%
burst/100 uring ops_per_sec 184.9 ops/s 183.9 ops/s 🔴▼ -0.74% 0.66%
burst_lockless/10 epoll ops_per_sec 1.91K ops/s 1.90K ops/s 🔴▼ -0.78% 0.78%
burst_lockless/10 uring ops_per_sec 1.92K ops/s 1.92K ops/s 🟢▲ +0.08% 1.06%
burst_lockless/100 epoll ops_per_sec 193.6 ops/s 192.7 ops/s 🔴▼ -0.33% 0.68%
burst_lockless/100 uring ops_per_sec 197.8 ops/s 197.3 ops/s 🔴▼ -0.29% 0.67%
concurrent/1 epoll ops_per_sec 15.08K ops/s 14.96K ops/s 🔴▼ -0.16% 1.08%
concurrent/1 uring ops_per_sec 13.57K ops/s 13.46K ops/s 🔴▼ -1.14% 1.03%
concurrent/16 epoll ops_per_sec 15.10K ops/s 15.06K ops/s 🔴▼ -0.45% 0.74%
concurrent/16 uring ops_per_sec 13.51K ops/s 13.44K ops/s 🔴▼ -1.40% 1.31%
concurrent/4 epoll ops_per_sec 15.11K ops/s 15.02K ops/s 🔴▼ -0.24% 0.72%
concurrent/4 uring ops_per_sec 13.50K ops/s 13.41K ops/s 🔴▼ -1.46% 1.33%
sequential epoll ops_per_sec 15.12K ops/s 15.05K ops/s 🟢▲ +0.03% 1.12%
sequential uring ops_per_sec 13.55K ops/s 13.47K ops/s 🔴▼ -0.85% 0.86%
sequential_lockless epoll ops_per_sec 15.26K ops/s 15.16K ops/s 🔴▼ -0.20% 1.13%
sequential_lockless uring ops_per_sec 14.48K ops/s 14.42K ops/s 🔴▼ -1.31% 1.11%

fan_out

Benchmark Backend Metric Base Head Δ Noise
concurrent_parents/1 epoll ops_per_sec 3.68K ops/s 3.68K ops/s 🟢▲ +0.05% 0.19%
concurrent_parents/1 uring ops_per_sec 3.45K ops/s 3.43K ops/s 🔴▼ -0.54% 1.18%
concurrent_parents/16 epoll ops_per_sec 3.57K ops/s 3.58K ops/s 🟢▲ +0.09% 0.11%
concurrent_parents/16 uring ops_per_sec 3.32K ops/s 3.32K ops/s 🔴▼ -0.17% 1.08%
concurrent_parents/4 epoll ops_per_sec 3.58K ops/s 3.59K ops/s 🟢▲ +0.29% 0.19%
concurrent_parents/4 uring ops_per_sec 3.36K ops/s 3.34K ops/s 🔴▼ -0.40% 1.05%
concurrent_parents_lockless/1 epoll ops_per_sec 3.73K ops/s 3.72K ops/s 🟢▲ +0.07% 0.86%
concurrent_parents_lockless/1 uring ops_per_sec 3.49K ops/s 3.46K ops/s 🔴▼ -0.51% 1.10%
concurrent_parents_lockless/16 epoll ops_per_sec 3.62K ops/s 3.61K ops/s 🟢▲ +0.14% 0.94%
concurrent_parents_lockless/16 uring ops_per_sec 3.35K ops/s 3.35K ops/s 🔴▼ -0.17% 0.82%
concurrent_parents_lockless/4 epoll ops_per_sec 3.63K ops/s 3.62K ops/s 🟢▲ +0.10% 1.01%
concurrent_parents_lockless/4 uring ops_per_sec 3.38K ops/s 3.37K ops/s 🔴▼ -0.15% 0.49%
fork_join/1 epoll ops_per_sec 54.23K ops/s 54.23K ops/s 🔴▼ -0.01% 0.32%
fork_join/1 uring ops_per_sec 53.37K ops/s 53.09K ops/s 🔴▼ -1.00% 1.38%
fork_join/16 epoll ops_per_sec 3.69K ops/s 3.68K ops/s 🟢▲ +0.28% 0.96%
fork_join/16 uring ops_per_sec 3.45K ops/s 3.42K ops/s 🔴▼ -0.42% 1.18%
fork_join/4 epoll ops_per_sec 14.57K ops/s 14.57K ops/s 🟢▲ +0.14% 0.50%
fork_join/4 uring ops_per_sec 13.75K ops/s 13.69K ops/s 🔴▼ -0.45% 1.06%
fork_join/64 epoll ops_per_sec 900.6 ops/s 898.4 ops/s 🟢▲ +0.11% 1.00%
fork_join/64 uring ops_per_sec 818.0 ops/s 811.6 ops/s 🔴▼ -0.43% 1.03%
fork_join_lockless/1 epoll ops_per_sec 55.56K ops/s 55.22K ops/s 🔴▼ -0.35% 0.97%
fork_join_lockless/1 uring ops_per_sec 54.11K ops/s 53.60K ops/s 🔴▼ -0.75% 1.24%
fork_join_lockless/16 epoll ops_per_sec 3.74K ops/s 3.72K ops/s 🔴▼ -0.13% 0.89%
fork_join_lockless/16 uring ops_per_sec 3.49K ops/s 3.46K ops/s 🔴▼ -0.35% 1.16%
fork_join_lockless/4 epoll ops_per_sec 14.80K ops/s 14.72K ops/s 🔴▼ -0.24% 0.85%
fork_join_lockless/4 uring ops_per_sec 13.91K ops/s 13.78K ops/s 🔴▼ -0.43% 1.14%
fork_join_lockless/64 epoll ops_per_sec 911.4 ops/s 906.4 ops/s 🔴▼ -0.04% 0.90%
fork_join_lockless/64 uring ops_per_sec 827.5 ops/s 821.8 ops/s 🔴▼ -0.30% 1.00%
nested/16 epoll ops_per_sec 890.8 ops/s 890.8 ops/s 🟢▲ +0.12% 0.17%
nested/16 uring ops_per_sec 803.3 ops/s 804.6 ops/s 🔴▼ -0.34% 1.06%
nested/4 epoll ops_per_sec 3.66K ops/s 3.65K ops/s 🔴▼ -0.26% 0.22%
nested/4 uring ops_per_sec 3.41K ops/s 3.39K ops/s 🔴▼ -0.48% 1.03%
nested_lockless/16 epoll ops_per_sec 900.1 ops/s 899.8 ops/s ⚪ 0.00% 0.22%
nested_lockless/16 uring ops_per_sec 818.5 ops/s 816.5 ops/s 🔴▼ -0.07% 1.17%
nested_lockless/4 epoll ops_per_sec 3.70K ops/s 3.69K ops/s 🔴▼ -0.19% 0.16%
nested_lockless/4 uring ops_per_sec 3.46K ops/s 3.44K ops/s 🔴▼ -0.74% 1.24%

http_server

Benchmark Backend Metric Base Head Δ Noise
concurrent/1 epoll ops_per_sec 54.61K ops/s 55.21K ops/s 🟢▲ +0.85% 1.33%
concurrent/1 uring ops_per_sec 53.53K ops/s 53.46K ops/s 🔴▼ -0.10% 0.32%
concurrent/16 epoll ops_per_sec 57.51K ops/s 58.32K ops/s 🟢▲ +2.04% 1.34%
concurrent/16 uring ops_per_sec 52.92K ops/s 52.96K ops/s 🔴▼ -0.22% 1.04%
concurrent/32 epoll ops_per_sec 57.11K ops/s 57.93K ops/s 🟢▲ +2.35% 1.37%
concurrent/32 uring ops_per_sec 52.46K ops/s 52.61K ops/s 🔴▼ -0.13% 1.10%
concurrent/4 epoll ops_per_sec 56.85K ops/s 57.53K ops/s 🟢▲ +1.67% 1.35%
concurrent/4 uring ops_per_sec 53.08K ops/s 52.99K ops/s 🔴▼ -0.12% 0.19%
multithread/1 epoll ops_per_sec 57.05K ops/s 57.87K ops/s 🟢▲ +2.12% 1.25%
multithread/1 uring ops_per_sec 52.52K ops/s 52.66K ops/s 🔴▼ -0.07% 0.92%
multithread/16 epoll ops_per_sec 160.7K ops/s 160.6K ops/s 🟢▲ +0.07% 0.66%
multithread/16 uring ops_per_sec 82.91K ops/s 82.69K ops/s 🔴▼ -0.27% 0.32%
multithread/2 epoll ops_per_sec 86.24K ops/s 86.34K ops/s 🔴▼ -0.02% 0.55%
multithread/2 uring ops_per_sec 90.95K ops/s 90.89K ops/s 🔴▼ -0.04% 0.82%
multithread/4 epoll ops_per_sec 157.3K ops/s 156.4K ops/s 🔴▼ -1.46% 1.15%
multithread/4 uring ops_per_sec 80.19K ops/s 79.90K ops/s 🔴▼ -0.53% 0.67%
multithread/8 epoll ops_per_sec 160.3K ops/s 160.3K ops/s 🔴▼ -0.12% 0.27%
multithread/8 uring ops_per_sec 78.37K ops/s 71.73K ops/s 🔴▼ -0.61% 19.40%
single_conn epoll ops_per_sec 54.54K ops/s 55.07K ops/s 🟢▲ +0.17% 1.39%
single_conn uring ops_per_sec 53.60K ops/s 53.57K ops/s 🔴▼ -0.13% 0.31%
single_conn_lockless epoll ops_per_sec 55.39K ops/s 55.89K ops/s 🟢▲ +0.45% 1.28%
single_conn_lockless uring ops_per_sec 54.12K ops/s 54.14K ops/s 🟢▲ +0.03% 0.26%

local_socket_latency

Benchmark Backend Metric Base Head Δ Noise
concurrent/1 epoll latency_mean_ns 7.42 µs 7.30 µs 🟢▲ +0.84% 4.07%
concurrent/1 uring latency_mean_ns 6.66 µs 6.60 µs 🟢▲ +0.62% 0.80%
concurrent/16 epoll latency_mean_ns 110.76 µs 110.17 µs 🟢▲ +0.40% 0.50%
concurrent/16 uring latency_mean_ns 109.27 µs 108.85 µs 🟢▲ +0.34% 0.69%
concurrent/4 epoll latency_mean_ns 28.14 µs 27.60 µs 🟢▲ +2.65% 1.52%
concurrent/4 uring latency_mean_ns 27.35 µs 27.16 µs 🟢▲ +0.60% 1.26%
concurrent_lockless/1 epoll latency_mean_ns 7.30 µs 7.16 µs 🟢▲ +0.43% 5.50%
concurrent_lockless/1 uring latency_mean_ns 6.72 µs 6.87 µs 🔴▼ -1.04% 5.42%
concurrent_lockless/16 epoll latency_mean_ns 109.02 µs 108.67 µs 🟢▲ +0.44% 0.72%
concurrent_lockless/16 uring latency_mean_ns 108.89 µs 108.71 µs 🟢▲ +0.49% 0.63%
concurrent_lockless/4 epoll latency_mean_ns 27.56 µs 27.32 µs 🟢▲ +0.63% 1.41%
concurrent_lockless/4 uring latency_mean_ns 26.93 µs 27.15 µs ⚪ 0.00% 1.79%
pingpong/1 epoll latency_mean_ns 7.36 µs 7.41 µs 🟢▲ +0.92% 4.91%
pingpong/1 uring latency_mean_ns 6.59 µs 6.62 µs 🟢▲ +0.25% 1.79%
pingpong/1024 epoll latency_mean_ns 7.91 µs 7.98 µs 🟢▲ +0.22% 3.43%
pingpong/1024 uring latency_mean_ns 7.16 µs 7.39 µs 🔴▼ -0.12% 5.30%
pingpong/64 epoll latency_mean_ns 7.15 µs 7.33 µs 🔴▼ -1.08% 4.06%
pingpong/64 uring latency_mean_ns 7.05 µs 6.77 µs 🟢▲ +1.03% 5.69%
pingpong_lockless/1 epoll latency_mean_ns 7.13 µs 6.98 µs 🟢▲ +0.70% 4.54%
pingpong_lockless/1 uring latency_mean_ns 6.87 µs 6.68 µs 🟢▲ +0.62% 5.23%
pingpong_lockless/1024 epoll latency_mean_ns 7.40 µs 7.60 µs 🔴▼ -1.75% 4.66%
pingpong_lockless/1024 uring latency_mean_ns 7.39 µs 7.05 µs 🟢▲ +8.88% 4.78%
pingpong_lockless/64 epoll latency_mean_ns 7.02 µs 7.17 µs 🟢▲ +0.23% 4.35%
pingpong_lockless/64 uring latency_mean_ns 6.64 µs 6.60 µs 🟢▲ +0.49% 0.80%

local_socket_throughput

Benchmark Backend Metric Base Head Δ Noise
bidirectional/1024 epoll bytes_per_sec 303.6 MB/s 304.3 MB/s 🔴▼ -0.04% 1.04%
bidirectional/1024 uring bytes_per_sec 300.7 MB/s 298.3 MB/s 🔴▼ -0.74% 0.51%
bidirectional/1048576 epoll bytes_per_sec 3.14 GB/s 3.16 GB/s 🟢▲ +1.94% 2.86%
bidirectional/1048576 uring bytes_per_sec 3.29 GB/s 3.29 GB/s 🔴▼ -0.10% 2.64%
bidirectional/16384 epoll bytes_per_sec 3.07 GB/s 3.00 GB/s 🔴▼ -1.77% 2.86%
bidirectional/16384 uring bytes_per_sec 2.39 GB/s 2.40 GB/s 🔴▼ -0.95% 1.55%
bidirectional/262144 epoll bytes_per_sec 3.11 GB/s 3.16 GB/s 🟢▲ +0.85% 1.47%
bidirectional/262144 uring bytes_per_sec 3.28 GB/s 3.27 GB/s 🟢▲ +0.06% 2.24%
bidirectional/4096 epoll bytes_per_sec 997.8 MB/s 989.8 MB/s 🔴▼ -1.13% 1.03%
bidirectional/4096 uring bytes_per_sec 980.1 MB/s 987.1 MB/s 🟢▲ +1.24% 0.90%
bidirectional/65536 epoll bytes_per_sec 2.90 GB/s 2.95 GB/s 🟢▲ +1.30% 2.02%
bidirectional/65536 uring bytes_per_sec 3.01 GB/s 3.06 GB/s 🟢▲ +1.35% 1.12%
bidirectional_lockless/1024 epoll bytes_per_sec 305.6 MB/s 305.7 MB/s 🟢▲ +0.01% 0.97%
bidirectional_lockless/1024 uring bytes_per_sec 300.3 MB/s 303.0 MB/s 🟢▲ +0.97% 0.89%
bidirectional_lockless/1048576 epoll bytes_per_sec 3.17 GB/s 3.17 GB/s 🔴▼ -0.10% 2.59%
bidirectional_lockless/1048576 uring bytes_per_sec 3.32 GB/s 3.28 GB/s 🔴▼ -2.31% 3.06%
bidirectional_lockless/16384 epoll bytes_per_sec 3.09 GB/s 3.02 GB/s 🔴▼ -1.25% 3.28%
bidirectional_lockless/16384 uring bytes_per_sec 2.40 GB/s 2.40 GB/s 🟢▲ +0.15% 1.71%
bidirectional_lockless/262144 epoll bytes_per_sec 3.15 GB/s 3.15 GB/s 🔴▼ -0.70% 1.81%
bidirectional_lockless/262144 uring bytes_per_sec 3.30 GB/s 3.27 GB/s 🔴▼ -1.26% 2.37%
bidirectional_lockless/4096 epoll bytes_per_sec 1.01 GB/s 996.6 MB/s 🟢▲ +0.29% 1.26%
bidirectional_lockless/4096 uring bytes_per_sec 983.2 MB/s 989.7 MB/s 🟢▲ +1.12% 1.52%
bidirectional_lockless/65536 epoll bytes_per_sec 2.94 GB/s 2.95 GB/s 🟢▲ +0.48% 1.39%
bidirectional_lockless/65536 uring bytes_per_sec 3.02 GB/s 3.05 GB/s 🟢▲ +0.90% 1.26%
unidirectional/1024 epoll bytes_per_sec 295.8 MB/s 295.9 MB/s 🟢▲ +0.72% 1.05%
unidirectional/1024 uring bytes_per_sec 301.1 MB/s 301.1 MB/s 🔴▼ -0.23% 0.80%
unidirectional/1048576 epoll bytes_per_sec 3.28 GB/s 3.31 GB/s 🟢▲ +0.86% 1.71%
unidirectional/1048576 uring bytes_per_sec 3.42 GB/s 3.42 GB/s 🟢▲ +0.93% 2.59%
unidirectional/16384 epoll bytes_per_sec 3.04 GB/s 3.05 GB/s 🔴▼ -0.80% 1.58%
unidirectional/16384 uring bytes_per_sec 2.60 GB/s 2.61 GB/s 🟢▲ +0.38% 1.01%
unidirectional/262144 epoll bytes_per_sec 3.23 GB/s 3.28 GB/s 🟢▲ +1.06% 2.27%
unidirectional/262144 uring bytes_per_sec 3.44 GB/s 3.40 GB/s 🔴▼ -0.51% 1.61%
unidirectional/4096 epoll bytes_per_sec 965.9 MB/s 974.0 MB/s 🟢▲ +1.02% 1.74%
unidirectional/4096 uring bytes_per_sec 985.8 MB/s 988.9 MB/s 🔴▼ -0.20% 1.24%
unidirectional/65536 epoll bytes_per_sec 3.17 GB/s 3.27 GB/s 🟢▲ +3.70% 2.86%
unidirectional/65536 uring bytes_per_sec 3.29 GB/s 3.34 GB/s 🟢▲ +1.36% 2.39%
unidirectional_lockless/1024 epoll bytes_per_sec 297.8 MB/s 298.0 MB/s 🔴▼ -0.23% 0.84%
unidirectional_lockless/1024 uring bytes_per_sec 304.2 MB/s 301.6 MB/s 🔴▼ -0.80% 1.00%
unidirectional_lockless/1048576 epoll bytes_per_sec 3.27 GB/s 3.30 GB/s 🟢▲ +1.60% 1.84%
unidirectional_lockless/1048576 uring bytes_per_sec 3.45 GB/s 3.40 GB/s 🔴▼ -2.31% 3.02%
unidirectional_lockless/16384 epoll bytes_per_sec 3.04 GB/s 3.01 GB/s 🔴▼ -0.33% 2.43%
unidirectional_lockless/16384 uring bytes_per_sec 2.65 GB/s 2.62 GB/s 🔴▼ -0.48% 1.86%
unidirectional_lockless/262144 epoll bytes_per_sec 3.26 GB/s 3.28 GB/s 🔴▼ -1.55% 3.13%
unidirectional_lockless/262144 uring bytes_per_sec 3.46 GB/s 3.41 GB/s 🔴▼ -1.22% 2.11%
unidirectional_lockless/4096 epoll bytes_per_sec 970.8 MB/s 977.0 MB/s 🟢▲ +0.30% 2.07%
unidirectional_lockless/4096 uring bytes_per_sec 998.0 MB/s 991.1 MB/s 🔴▼ -0.14% 1.35%
unidirectional_lockless/65536 epoll bytes_per_sec 3.14 GB/s 3.23 GB/s 🟢▲ +3.08% 3.14%
unidirectional_lockless/65536 uring bytes_per_sec 3.33 GB/s 3.37 GB/s 🟢▲ +1.31% 1.65%

socket_latency

Benchmark Backend Metric Base Head Δ Noise
concurrent/1 epoll latency_mean_ns 14.83 µs 14.74 µs 🟢▲ +0.38% 1.10%
concurrent/1 uring latency_mean_ns 14.61 µs 14.54 µs 🟢▲ +0.05% 1.25%
concurrent/16 epoll latency_mean_ns 233.57 µs 233.09 µs 🟢▲ +0.12% 0.28%
concurrent/16 uring latency_mean_ns 236.27 µs 235.21 µs ⚪ 0.00% 1.14%
concurrent/4 epoll latency_mean_ns 58.36 µs 57.92 µs 🟢▲ +0.39% 1.16%
concurrent/4 uring latency_mean_ns 58.65 µs 58.40 µs 🟢▲ +0.11% 1.19%
concurrent_lockless/1 epoll latency_mean_ns 14.71 µs 14.65 µs 🔴▼ -0.06% 0.95%
concurrent_lockless/1 uring latency_mean_ns 14.57 µs 14.55 µs 🟢▲ +0.03% 0.69%
concurrent_lockless/16 epoll latency_mean_ns 232.19 µs 230.62 µs 🟢▲ +0.35% 1.14%
concurrent_lockless/16 uring latency_mean_ns 235.56 µs 236.15 µs 🔴▼ -0.27% 0.18%
concurrent_lockless/4 epoll latency_mean_ns 57.91 µs 57.60 µs 🟢▲ +0.29% 1.01%
concurrent_lockless/4 uring latency_mean_ns 58.48 µs 58.64 µs 🔴▼ -0.34% 0.19%
pingpong/1 epoll latency_mean_ns 14.74 µs 14.64 µs 🟢▲ +0.02% 1.54%
pingpong/1 uring latency_mean_ns 14.53 µs 14.47 µs 🔴▼ -0.19% 1.29%
pingpong/1024 epoll latency_mean_ns 15.10 µs 14.92 µs 🟢▲ +1.36% 1.31%
pingpong/1024 uring latency_mean_ns 14.85 µs 14.79 µs 🔴▼ -0.02% 1.26%
pingpong/64 epoll latency_mean_ns 14.80 µs 14.65 µs 🟢▲ +1.40% 1.37%
pingpong/64 uring latency_mean_ns 14.61 µs 14.53 µs 🟢▲ +0.07% 1.44%
pingpong_lockless/1 epoll latency_mean_ns 14.64 µs 14.49 µs 🟢▲ +0.34% 1.38%
pingpong_lockless/1 uring latency_mean_ns 14.51 µs 14.45 µs 🟢▲ +0.08% 1.30%
pingpong_lockless/1024 epoll latency_mean_ns 14.99 µs 14.87 µs 🟢▲ +0.47% 1.12%
pingpong_lockless/1024 uring latency_mean_ns 14.84 µs 14.77 µs ⚪ 0.00% 1.32%
pingpong_lockless/64 epoll latency_mean_ns 14.71 µs 14.57 µs 🟢▲ +0.24% 1.39%
pingpong_lockless/64 uring latency_mean_ns 14.60 µs 14.51 µs ⚪ 0.00% 1.22%

socket_throughput

Benchmark Backend Metric Base Head Δ Noise
bidirectional/1024 epoll bytes_per_sec 134.2 MB/s 133.7 MB/s 🟢▲ +0.01% 1.34%
bidirectional/1024 uring bytes_per_sec 140.6 MB/s 140.0 MB/s 🔴▼ -0.15% 1.06%
bidirectional/1048576 epoll bytes_per_sec 3.30 GB/s 3.26 GB/s 🔴▼ -1.55% 1.92%
bidirectional/1048576 uring bytes_per_sec 3.24 GB/s 3.24 GB/s 🟢▲ +0.63% 1.11%
bidirectional/16384 epoll bytes_per_sec 1.62 GB/s 1.62 GB/s 🔴▼ -0.79% 2.14%
bidirectional/16384 uring bytes_per_sec 1.52 GB/s 1.51 GB/s 🔴▼ -0.96% 0.95%
bidirectional/262144 epoll bytes_per_sec 3.24 GB/s 3.21 GB/s 🔴▼ -0.88% 1.06%
bidirectional/262144 uring bytes_per_sec 3.19 GB/s 3.18 GB/s 🟢▲ +0.36% 1.45%
bidirectional/4096 epoll bytes_per_sec 504.2 MB/s 503.0 MB/s 🟢▲ +0.13% 1.26%
bidirectional/4096 uring bytes_per_sec 493.4 MB/s 491.6 MB/s 🔴▼ -0.16% 0.88%
bidirectional/65536 epoll bytes_per_sec 2.58 GB/s 2.54 GB/s 🔴▼ -0.53% 2.36%
bidirectional/65536 uring bytes_per_sec 2.79 GB/s 2.74 GB/s 🔴▼ -1.74% 1.67%
bidirectional_lockless/1024 epoll bytes_per_sec 134.0 MB/s 134.1 MB/s 🟢▲ +0.04% 0.34%
bidirectional_lockless/1024 uring bytes_per_sec 141.3 MB/s 140.6 MB/s 🔴▼ -0.39% 0.90%
bidirectional_lockless/1048576 epoll bytes_per_sec 3.30 GB/s 3.33 GB/s 🟢▲ +1.30% 1.97%
bidirectional_lockless/1048576 uring bytes_per_sec 3.25 GB/s 3.23 GB/s 🔴▼ -0.80% 0.82%
bidirectional_lockless/16384 epoll bytes_per_sec 1.63 GB/s 1.62 GB/s 🟢▲ +0.02% 1.51%
bidirectional_lockless/16384 uring bytes_per_sec 1.53 GB/s 1.55 GB/s 🟢▲ +1.08% 1.65%
bidirectional_lockless/262144 epoll bytes_per_sec 3.24 GB/s 3.20 GB/s 🔴▼ -0.95% 1.01%
bidirectional_lockless/262144 uring bytes_per_sec 3.17 GB/s 3.15 GB/s 🔴▼ -0.24% 0.68%
bidirectional_lockless/4096 epoll bytes_per_sec 506.2 MB/s 504.2 MB/s 🔴▼ -0.12% 1.05%
bidirectional_lockless/4096 uring bytes_per_sec 495.3 MB/s 493.7 MB/s 🔴▼ -0.23% 0.77%
bidirectional_lockless/65536 epoll bytes_per_sec 2.53 GB/s 2.52 GB/s 🔴▼ -0.44% 2.13%
bidirectional_lockless/65536 uring bytes_per_sec 2.80 GB/s 2.75 GB/s 🔴▼ -1.02% 1.41%
multithread/2 epoll bytes_per_sec 3.41 GB/s 3.42 GB/s 🟢▲ +0.35% 0.81%
multithread/2 uring bytes_per_sec 3.64 GB/s 3.65 GB/s 🟢▲ +0.38% 1.03%
multithread/4 epoll bytes_per_sec 4.84 GB/s 4.86 GB/s 🟢▲ +0.29% 0.74%
multithread/4 uring bytes_per_sec 5.05 GB/s 5.05 GB/s 🔴▼ -0.39% 0.34%
multithread/8 epoll bytes_per_sec 4.95 GB/s 4.95 GB/s 🔴▼ -0.19% 0.26%
multithread/8 uring bytes_per_sec 5.11 GB/s 5.11 GB/s 🟢▲ +0.21% 0.31%
unidirectional/1024 epoll bytes_per_sec 125.5 MB/s 125.6 MB/s 🟢▲ +0.78% 1.30%
unidirectional/1024 uring bytes_per_sec 140.0 MB/s 138.6 MB/s 🔴▼ -0.22% 1.17%
unidirectional/1048576 epoll bytes_per_sec 3.33 GB/s 3.35 GB/s 🔴▼ -0.24% 2.54%
unidirectional/1048576 uring bytes_per_sec 3.42 GB/s 3.40 GB/s 🟢▲ +0.13% 1.45%
unidirectional/16384 epoll bytes_per_sec 1.53 GB/s 1.54 GB/s 🟢▲ +1.15% 1.80%
unidirectional/16384 uring bytes_per_sec 1.57 GB/s 1.56 GB/s 🔴▼ -0.97% 3.00%
unidirectional/262144 epoll bytes_per_sec 3.32 GB/s 3.32 GB/s 🟢▲ +0.35% 1.17%
unidirectional/262144 uring bytes_per_sec 3.21 GB/s 3.19 GB/s 🟢▲ +0.20% 2.04%
unidirectional/4096 epoll bytes_per_sec 470.4 MB/s 471.7 MB/s 🟢▲ +0.60% 1.50%
unidirectional/4096 uring bytes_per_sec 496.1 MB/s 491.4 MB/s 🟢▲ +0.01% 1.80%
unidirectional/65536 epoll bytes_per_sec 2.66 GB/s 2.68 GB/s 🟢▲ +0.26% 5.73%
unidirectional/65536 uring bytes_per_sec 2.73 GB/s 2.71 GB/s 🔴▼ -1.21% 0.57%
unidirectional_lockless/1024 epoll bytes_per_sec 125.5 MB/s 126.5 MB/s 🟢▲ +0.46% 1.19%
unidirectional_lockless/1024 uring bytes_per_sec 139.9 MB/s 139.1 MB/s 🔴▼ -0.43% 0.84%
unidirectional_lockless/1048576 epoll bytes_per_sec 3.37 GB/s 3.36 GB/s 🔴▼ -0.16% 1.08%
unidirectional_lockless/1048576 uring bytes_per_sec 3.36 GB/s 3.38 GB/s 🟢▲ +0.49% 1.31%
unidirectional_lockless/16384 epoll bytes_per_sec 1.53 GB/s 1.55 GB/s 🔴▼ -0.27% 1.75%
unidirectional_lockless/16384 uring bytes_per_sec 1.59 GB/s 1.58 GB/s 🔴▼ -0.80% 2.66%
unidirectional_lockless/262144 epoll bytes_per_sec 3.36 GB/s 3.33 GB/s 🔴▼ -0.59% 1.18%
unidirectional_lockless/262144 uring bytes_per_sec 3.22 GB/s 3.24 GB/s 🔴▼ -0.25% 0.98%
unidirectional_lockless/4096 epoll bytes_per_sec 471.5 MB/s 473.9 MB/s 🔴▼ -0.01% 1.21%
unidirectional_lockless/4096 uring bytes_per_sec 490.5 MB/s 490.3 MB/s 🟢▲ +0.10% 1.00%
unidirectional_lockless/65536 epoll bytes_per_sec 2.73 GB/s 2.77 GB/s 🟢▲ +1.11% 3.09%
unidirectional_lockless/65536 uring bytes_per_sec 2.72 GB/s 2.73 GB/s 🟢▲ +0.06% 4.66%
windows — full results (77 benchmarks, 5 iterations, 1.5s each)

accept_churn

Benchmark Backend Metric Base Head Δ Noise
burst/10 iocp ops_per_sec 1.56K ops/s 1.57K ops/s 🟢▲ +0.36% 0.72%
burst/100 iocp ops_per_sec 157.5 ops/s 156.7 ops/s 🔴▼ -0.38% 1.00%
burst_lockless/10 iocp ops_per_sec 1.58K ops/s 1.57K ops/s 🔴▼ -0.31% 0.23%
burst_lockless/100 iocp ops_per_sec 159.3 ops/s 160.0 ops/s 🟢▲ +0.38% 1.28%
concurrent/1 iocp ops_per_sec 12.49K ops/s 12.47K ops/s 🟢▲ +0.03% 0.25%
concurrent/16 iocp ops_per_sec 13.47K ops/s 13.44K ops/s 🔴▼ -0.34% 0.46%
concurrent/4 iocp ops_per_sec 13.13K ops/s 13.11K ops/s 🔴▼ -0.27% 0.12%
sequential iocp ops_per_sec 12.47K ops/s 12.47K ops/s 🟢▲ +0.19% 0.24%
sequential_lockless iocp ops_per_sec 12.49K ops/s 12.47K ops/s 🔴▼ -0.11% 0.25%

fan_out

Benchmark Backend Metric Base Head Δ Noise
concurrent_parents/1 iocp ops_per_sec 7.36K ops/s 7.34K ops/s 🔴▼ -0.27% 0.35%
concurrent_parents/16 iocp ops_per_sec 6.22K ops/s 6.22K ops/s 🔴▼ -0.40% 1.64%
concurrent_parents/4 iocp ops_per_sec 6.91K ops/s 6.90K ops/s 🔴▼ -0.04% 0.90%
concurrent_parents_lockless/1 iocp ops_per_sec 7.36K ops/s 7.35K ops/s 🔴▼ -0.25% 0.31%
concurrent_parents_lockless/16 iocp ops_per_sec 6.36K ops/s 6.36K ops/s 🟢▲ +0.12% 1.48%
concurrent_parents_lockless/4 iocp ops_per_sec 6.95K ops/s 6.95K ops/s 🟢▲ +0.25% 0.74%
fork_join/1 iocp ops_per_sec 112.6K ops/s 112.5K ops/s 🔴▼ -0.29% 0.65%
fork_join/16 iocp ops_per_sec 7.35K ops/s 7.34K ops/s 🟢▲ +0.05% 0.40%
fork_join/4 iocp ops_per_sec 29.10K ops/s 29.11K ops/s 🔴▼ -0.01% 0.32%
fork_join/64 iocp ops_per_sec 1.72K ops/s 1.73K ops/s 🟢▲ +0.56% 2.40%
fork_join_lockless/1 iocp ops_per_sec 112.3K ops/s 112.4K ops/s 🟢▲ +0.20% 0.33%
fork_join_lockless/16 iocp ops_per_sec 7.34K ops/s 7.36K ops/s 🟢▲ +0.38% 0.27%
fork_join_lockless/4 iocp ops_per_sec 29.07K ops/s 29.12K ops/s 🟢▲ +0.20% 0.58%
fork_join_lockless/64 iocp ops_per_sec 1.72K ops/s 1.73K ops/s 🟢▲ +0.20% 2.51%
nested/16 iocp ops_per_sec 1.69K ops/s 1.69K ops/s 🔴▼ -0.31% 1.15%
nested/4 iocp ops_per_sec 7.15K ops/s 7.16K ops/s 🟢▲ +0.20% 0.22%
nested_lockless/16 iocp ops_per_sec 1.69K ops/s 1.69K ops/s 🔴▼ -0.06% 1.05%
nested_lockless/4 iocp ops_per_sec 7.18K ops/s 7.14K ops/s 🔴▼ -0.38% 0.31%

http_server

Benchmark Backend Metric Base Head Δ Noise
concurrent/1 iocp ops_per_sec 110.0K ops/s 111.0K ops/s 🟢▲ +0.84% 0.37%
concurrent/16 iocp ops_per_sec 107.5K ops/s 107.8K ops/s 🟢▲ +0.18% 0.48%
concurrent/32 iocp ops_per_sec 106.8K ops/s 107.2K ops/s 🟢▲ +0.40% 0.46%
concurrent/4 iocp ops_per_sec 107.8K ops/s 108.4K ops/s 🟢▲ +0.20% 0.49%
multithread/1 iocp ops_per_sec 106.9K ops/s 107.4K ops/s 🟢▲ +0.53% 0.52%
multithread/16 iocp ops_per_sec 267.0K ops/s 267.3K ops/s 🟢▲ +0.01% 0.43%
multithread/2 iocp ops_per_sec 180.6K ops/s 180.7K ops/s 🔴▼ -0.03% 0.89%
multithread/4 iocp ops_per_sec 224.6K ops/s 224.9K ops/s 🔴▼ -0.27% 0.84%
multithread/8 iocp ops_per_sec 266.9K ops/s 266.5K ops/s 🔴▼ -0.02% 0.65%
single_conn iocp ops_per_sec 109.7K ops/s 111.2K ops/s 🟢▲ +1.51% 0.42%
single_conn_lockless iocp ops_per_sec 110.0K ops/s 110.9K ops/s 🟢▲ +0.90% 0.41%

socket_latency

Benchmark Backend Metric Base Head Δ Noise
concurrent/1 iocp latency_mean_ns 7.57 µs 7.56 µs 🔴▼ -0.07% 0.34%
concurrent/16 iocp latency_mean_ns 127.96 µs 131.19 µs 🔴▼ -2.86% 5.19%
concurrent/4 iocp latency_mean_ns 30.42 µs 30.42 µs 🔴▼ -0.11% 0.46%
concurrent_lockless/1 iocp latency_mean_ns 7.57 µs 7.57 µs 🟢▲ +0.05% 0.45%
concurrent_lockless/16 iocp latency_mean_ns 121.32 µs 122.83 µs 🔴▼ -0.23% 2.72%
concurrent_lockless/4 iocp latency_mean_ns 30.39 µs 30.51 µs 🔴▼ -0.16% 0.43%
pingpong/1 iocp latency_mean_ns 7.57 µs 7.56 µs 🟢▲ +0.11% 0.55%
pingpong/1024 iocp latency_mean_ns 7.68 µs 7.69 µs 🔴▼ -0.11% 0.61%
pingpong/64 iocp latency_mean_ns 7.59 µs 7.60 µs 🔴▼ -0.16% 0.34%
pingpong_lockless/1 iocp latency_mean_ns 7.55 µs 7.54 µs 🟢▲ +0.34% 0.58%
pingpong_lockless/1024 iocp latency_mean_ns 7.68 µs 7.67 µs 🟢▲ +0.08% 0.63%
pingpong_lockless/64 iocp latency_mean_ns 7.58 µs 7.57 µs 🟢▲ +0.30% 0.49%

socket_throughput

Benchmark Backend Metric Base Head Δ Noise
bidirectional/1024 iocp bytes_per_sec 282.3 MB/s 281.2 MB/s 🔴▼ -0.56% 0.41%
bidirectional/1048576 iocp bytes_per_sec 5.66 GB/s 5.18 GB/s 🔴▼ -13.43% 9.27%
bidirectional/16384 iocp bytes_per_sec 3.75 GB/s 3.76 GB/s 🟢▲ +0.51% 0.53%
bidirectional/262144 iocp bytes_per_sec 9.65 GB/s 9.65 GB/s 🔴▼ -0.02% 0.43%
bidirectional/4096 iocp bytes_per_sec 1.08 GB/s 1.08 GB/s 🟢▲ +0.28% 0.41%
bidirectional/65536 iocp bytes_per_sec 9.16 GB/s 9.12 GB/s 🟢▲ +0.37% 1.25%
bidirectional_lockless/1024 iocp bytes_per_sec 280.7 MB/s 281.5 MB/s 🟢▲ +0.38% 0.32%
bidirectional_lockless/1048576 iocp bytes_per_sec 6.11 GB/s 5.52 GB/s 🔴▼ -10.26% 4.13%
bidirectional_lockless/16384 iocp bytes_per_sec 3.72 GB/s 3.70 GB/s 🟢▲ +0.08% 3.02%
bidirectional_lockless/262144 iocp bytes_per_sec 9.91 GB/s 9.76 GB/s 🔴▼ -1.11% 1.20%
bidirectional_lockless/4096 iocp bytes_per_sec 1.08 GB/s 1.08 GB/s 🟢▲ +0.03% 0.47%
bidirectional_lockless/65536 iocp bytes_per_sec 9.02 GB/s 9.05 GB/s 🟢▲ +0.13% 0.98%
multithread/2 iocp bytes_per_sec 12.88 GB/s 12.85 GB/s 🔴▼ -0.47% 0.84%
multithread/4 iocp bytes_per_sec 17.10 GB/s 17.24 GB/s 🟢▲ +0.29% 1.32%
multithread/8 iocp bytes_per_sec 18.40 GB/s 18.38 GB/s 🟢▲ +0.04% 0.28%
unidirectional/1024 iocp bytes_per_sec 286.1 MB/s 285.1 MB/s 🔴▼ -0.48% 0.28%
unidirectional/1048576 iocp bytes_per_sec 4.56 GB/s 4.62 GB/s 🟢▲ +1.30% 2.53%
unidirectional/16384 iocp bytes_per_sec 3.78 GB/s 3.71 GB/s 🔴▼ -1.60% 4.50%
unidirectional/262144 iocp bytes_per_sec 8.89 GB/s 9.19 GB/s 🟢▲ +4.33% 5.17%
unidirectional/4096 iocp bytes_per_sec 1.10 GB/s 1.09 GB/s 🔴▼ -0.87% 1.47%
unidirectional/65536 iocp bytes_per_sec 9.28 GB/s 8.80 GB/s 🔴▼ -0.44% 12.94%
unidirectional_lockless/1024 iocp bytes_per_sec 286.6 MB/s 285.1 MB/s 🔴▼ -0.88% 0.58%
unidirectional_lockless/1048576 iocp bytes_per_sec 5.28 GB/s 4.94 GB/s 🔴▼ -4.87% 6.01%
unidirectional_lockless/16384 iocp bytes_per_sec 3.81 GB/s 3.82 GB/s 🟢▲ +0.42% 0.93%
unidirectional_lockless/262144 iocp bytes_per_sec 9.86 GB/s 9.68 GB/s 🔴▼ -1.21% 3.44%
unidirectional_lockless/4096 iocp bytes_per_sec 1.10 GB/s 1.09 GB/s 🔴▼ -0.35% 0.36%
unidirectional_lockless/65536 iocp bytes_per_sec 9.40 GB/s 9.39 GB/s 🔴▼ -0.27% 1.49%
macos — full results (113 benchmarks, 5 iterations, 1.5s each)

accept_churn

Benchmark Backend Metric Base Head Δ Noise
burst/10 kqueue ops_per_sec 4.32K ops/s 4.34K ops/s 🟢▲ +0.51% 0.67%
burst/100 kqueue ops_per_sec 444.1 ops/s 444.8 ops/s 🟢▲ +0.08% 0.74%
burst_lockless/10 kqueue ops_per_sec 4.36K ops/s 4.38K ops/s ⚪ 0.00% 0.59%
burst_lockless/100 kqueue ops_per_sec 447.6 ops/s 448.9 ops/s 🟢▲ +0.28% 0.76%
concurrent/1 kqueue ops_per_sec 20.02K ops/s 20.15K ops/s 🟢▲ +0.69% 1.05%
concurrent/16 kqueue ops_per_sec 35.92K ops/s 36.15K ops/s 🟢▲ +0.20% 0.57%
concurrent/4 kqueue ops_per_sec 29.34K ops/s 29.31K ops/s 🔴▼ -0.13% 0.67%
sequential kqueue ops_per_sec 20.43K ops/s 20.39K ops/s 🔴▼ -0.07% 0.59%
sequential_lockless kqueue ops_per_sec 20.05K ops/s 20.10K ops/s 🟢▲ +0.06% 1.53%

fan_out

Benchmark Backend Metric Base Head Δ Noise
concurrent_parents/1 kqueue ops_per_sec 8.03K ops/s 8.04K ops/s 🟢▲ +0.33% 1.05%
concurrent_parents/16 kqueue ops_per_sec 7.00K ops/s 7.62K ops/s 🟢▲ +2.99% 20.22%
concurrent_parents/4 kqueue ops_per_sec 8.23K ops/s 8.19K ops/s ⚪ 0.00% 1.75%
concurrent_parents_lockless/1 kqueue ops_per_sec 8.13K ops/s 8.14K ops/s 🟢▲ +0.24% 1.32%
concurrent_parents_lockless/16 kqueue ops_per_sec 6.98K ops/s 7.04K ops/s 🔴▼ -0.29% 21.48%
concurrent_parents_lockless/4 kqueue ops_per_sec 8.31K ops/s 8.32K ops/s 🔴▼ -0.08% 1.74%
fork_join/1 kqueue ops_per_sec 47.80K ops/s 48.01K ops/s 🟢▲ +0.45% 0.74%
fork_join/16 kqueue ops_per_sec 8.02K ops/s 8.03K ops/s 🟢▲ +0.08% 0.94%
fork_join/4 kqueue ops_per_sec 23.56K ops/s 23.63K ops/s 🟢▲ +0.20% 0.81%
fork_join/64 kqueue ops_per_sec 2.06K ops/s 2.04K ops/s 🔴▼ -0.38% 2.53%
fork_join_lockless/1 kqueue ops_per_sec 49.43K ops/s 49.66K ops/s 🟢▲ +0.62% 0.50%
fork_join_lockless/16 kqueue ops_per_sec 8.13K ops/s 8.12K ops/s 🔴▼ -0.11% 1.50%
fork_join_lockless/4 kqueue ops_per_sec 23.54K ops/s 23.59K ops/s 🟢▲ +0.26% 0.39%
fork_join_lockless/64 kqueue ops_per_sec 2.07K ops/s 2.06K ops/s 🔴▼ -0.31% 2.57%
nested/16 kqueue ops_per_sec 2.03K ops/s 2.02K ops/s 🔴▼ -0.27% 2.39%
nested/4 kqueue ops_per_sec 7.93K ops/s 7.94K ops/s 🔴▼ -0.10% 0.71%
nested_lockless/16 kqueue ops_per_sec 2.05K ops/s 2.04K ops/s 🔴▼ -0.03% 2.34%
nested_lockless/4 kqueue ops_per_sec 8.03K ops/s 8.04K ops/s 🔴▼ -0.22% 1.12%

http_server

Benchmark Backend Metric Base Head Δ Noise
concurrent/1 kqueue ops_per_sec 49.12K ops/s 49.13K ops/s 🔴▼ -0.03% 0.16%
concurrent/16 kqueue ops_per_sec 130.0K ops/s 129.9K ops/s 🟢▲ +0.16% 0.49%
concurrent/32 kqueue ops_per_sec 130.1K ops/s 129.4K ops/s 🟢▲ +0.30% 1.17%
concurrent/4 kqueue ops_per_sec 89.04K ops/s 89.61K ops/s 🟢▲ +0.22% 0.74%
multithread/1 kqueue ops_per_sec 130.2K ops/s 129.6K ops/s 🟢▲ +0.51% 1.17%
multithread/16 kqueue ops_per_sec 132.2K ops/s 132.7K ops/s 🟢▲ +0.13% 0.40%
multithread/2 kqueue ops_per_sec 183.2K ops/s 184.3K ops/s 🟢▲ +0.24% 0.54%
multithread/4 kqueue ops_per_sec 163.1K ops/s 162.5K ops/s 🔴▼ -0.32% 0.80%
multithread/8 kqueue ops_per_sec 138.9K ops/s 138.5K ops/s 🔴▼ -0.07% 1.86%
single_conn kqueue ops_per_sec 49.09K ops/s 49.14K ops/s 🟢▲ +0.12% 0.14%
single_conn_lockless kqueue ops_per_sec 49.17K ops/s 49.24K ops/s 🟢▲ +0.23% 0.27%

local_socket_latency

Benchmark Backend Metric Base Head Δ Noise
concurrent/1 kqueue latency_mean_ns 1.85 µs 1.85 µs 🔴▼ -0.02% 0.69%
concurrent/16 kqueue latency_mean_ns 27.27 µs 27.42 µs 🔴▼ -0.46% 0.46%
concurrent/4 kqueue latency_mean_ns 6.87 µs 6.87 µs 🔴▼ -0.07% 0.37%
concurrent_lockless/1 kqueue latency_mean_ns 1.84 µs 1.84 µs 🔴▼ -0.02% 0.44%
concurrent_lockless/16 kqueue latency_mean_ns 27.08 µs 27.17 µs 🔴▼ -0.33% 0.58%
concurrent_lockless/4 kqueue latency_mean_ns 6.83 µs 6.83 µs 🔴▼ -0.13% 0.67%
pingpong/1 kqueue latency_mean_ns 1.85 µs 1.85 µs 🔴▼ -0.49% 0.46%
pingpong/1024 kqueue latency_mean_ns 1.94 µs 1.95 µs 🔴▼ -0.51% 0.66%
pingpong/64 kqueue latency_mean_ns 1.85 µs 1.85 µs 🔴▼ -0.02% 0.44%
pingpong_lockless/1 kqueue latency_mean_ns 1.83 µs 1.83 µs ⚪ 0.00% 0.82%
pingpong_lockless/1024 kqueue latency_mean_ns 1.94 µs 1.93 µs 🟢▲ +0.50% 0.66%
pingpong_lockless/64 kqueue latency_mean_ns 1.83 µs 1.83 µs 🔴▼ -0.23% 0.48%

local_socket_throughput

Benchmark Backend Metric Base Head Δ Noise
bidirectional/1024 kqueue bytes_per_sec 1.29 GB/s 1.30 GB/s 🟢▲ +0.38% 0.26%
bidirectional/1048576 kqueue bytes_per_sec 3.83 GB/s 3.82 GB/s 🟢▲ +0.13% 0.67%
bidirectional/16384 kqueue bytes_per_sec 3.83 GB/s 3.84 GB/s 🟢▲ +0.12% 0.76%
bidirectional/262144 kqueue bytes_per_sec 3.82 GB/s 3.82 GB/s 🟢▲ +0.22% 0.84%
bidirectional/4096 kqueue bytes_per_sec 2.89 GB/s 2.89 GB/s 🟢▲ +0.10% 0.33%
bidirectional/65536 kqueue bytes_per_sec 3.82 GB/s 3.82 GB/s 🟢▲ +0.23% 0.65%
bidirectional_lockless/1024 kqueue bytes_per_sec 1.30 GB/s 1.31 GB/s 🟢▲ +0.08% 0.55%
bidirectional_lockless/1048576 kqueue bytes_per_sec 3.91 GB/s 3.91 GB/s 🟢▲ +0.35% 0.76%
bidirectional_lockless/16384 kqueue bytes_per_sec 3.90 GB/s 3.90 GB/s 🟢▲ +0.12% 1.13%
bidirectional_lockless/262144 kqueue bytes_per_sec 3.90 GB/s 3.89 GB/s 🔴▼ -0.17% 0.59%
bidirectional_lockless/4096 kqueue bytes_per_sec 2.93 GB/s 2.94 GB/s 🟢▲ +0.42% 0.64%
bidirectional_lockless/65536 kqueue bytes_per_sec 3.92 GB/s 3.90 GB/s 🔴▼ -0.24% 0.72%
unidirectional/1024 kqueue bytes_per_sec 1.27 GB/s 1.27 GB/s 🟢▲ +0.04% 0.40%
unidirectional/1048576 kqueue bytes_per_sec 3.44 GB/s 3.45 GB/s 🟢▲ +0.10% 0.68%
unidirectional/16384 kqueue bytes_per_sec 3.46 GB/s 3.46 GB/s 🟢▲ +0.07% 0.41%
unidirectional/262144 kqueue bytes_per_sec 3.45 GB/s 3.46 GB/s 🟢▲ +0.38% 0.36%
unidirectional/4096 kqueue bytes_per_sec 2.68 GB/s 2.67 GB/s 🔴▼ -0.18% 0.41%
unidirectional/65536 kqueue bytes_per_sec 3.46 GB/s 3.46 GB/s 🟢▲ +0.17% 0.22%
unidirectional_lockless/1024 kqueue bytes_per_sec 1.27 GB/s 1.28 GB/s 🟢▲ +0.46% 0.38%
unidirectional_lockless/1048576 kqueue bytes_per_sec 3.51 GB/s 3.53 GB/s 🟢▲ +0.76% 0.54%
unidirectional_lockless/16384 kqueue bytes_per_sec 3.47 GB/s 3.52 GB/s 🟢▲ +0.66% 2.53%
unidirectional_lockless/262144 kqueue bytes_per_sec 3.49 GB/s 3.51 GB/s 🔴▼ -0.10% 1.58%
unidirectional_lockless/4096 kqueue bytes_per_sec 2.70 GB/s 2.71 GB/s 🟢▲ +0.02% 0.44%
unidirectional_lockless/65536 kqueue bytes_per_sec 3.50 GB/s 3.52 GB/s 🟢▲ +0.51% 0.65%

socket_latency

Benchmark Backend Metric Base Head Δ Noise
concurrent/1 kqueue latency_mean_ns 18.89 µs 18.89 µs 🔴▼ -0.03% 0.16%
concurrent/16 kqueue latency_mean_ns 120.98 µs 120.33 µs 🟢▲ +0.13% 0.37%
concurrent/4 kqueue latency_mean_ns 43.82 µs 43.41 µs 🟢▲ +1.20% 0.89%
concurrent_lockless/1 kqueue latency_mean_ns 18.87 µs 18.83 µs 🟢▲ +0.31% 0.25%
concurrent_lockless/16 kqueue latency_mean_ns 121.18 µs 120.37 µs 🟢▲ +0.20% 0.88%
concurrent_lockless/4 kqueue latency_mean_ns 43.05 µs 42.96 µs 🟢▲ +0.01% 0.49%
pingpong/1 kqueue latency_mean_ns 15.44 µs 15.56 µs 🔴▼ -0.50% 1.17%
pingpong/1024 kqueue latency_mean_ns 19.11 µs 19.10 µs 🟢▲ +0.16% 0.18%
pingpong/64 kqueue latency_mean_ns 18.89 µs 18.91 µs 🔴▼ -0.02% 0.18%
pingpong_lockless/1 kqueue latency_mean_ns 15.40 µs 15.42 µs 🔴▼ -0.06% 0.41%
pingpong_lockless/1024 kqueue latency_mean_ns 19.09 µs 19.07 µs 🟢▲ +0.08% 0.14%
pingpong_lockless/64 kqueue latency_mean_ns 18.86 µs 18.84 µs 🟢▲ +0.37% 0.60%

socket_throughput

Benchmark Backend Metric Base Head Δ Noise
bidirectional/1024 kqueue bytes_per_sec 474.6 MB/s 471.5 MB/s 🔴▼ -0.86% 0.58%
bidirectional/1048576 kqueue bytes_per_sec 7.78 GB/s 7.66 GB/s 🟢▲ +0.67% 5.58%
bidirectional/16384 kqueue bytes_per_sec 4.54 GB/s 4.51 GB/s 🔴▼ -0.63% 1.00%
bidirectional/262144 kqueue bytes_per_sec 8.79 GB/s 8.65 GB/s 🔴▼ -2.16% 1.92%
bidirectional/4096 kqueue bytes_per_sec 1.82 GB/s 1.81 GB/s 🔴▼ -1.03% 1.05%
bidirectional/65536 kqueue bytes_per_sec 7.63 GB/s 7.53 GB/s 🔴▼ -1.65% 1.32%
bidirectional_lockless/1024 kqueue bytes_per_sec 474.2 MB/s 475.6 MB/s 🟢▲ +0.06% 1.14%
bidirectional_lockless/1048576 kqueue bytes_per_sec 7.73 GB/s 7.68 GB/s 🟢▲ +0.14% 6.79%
bidirectional_lockless/16384 kqueue bytes_per_sec 4.57 GB/s 4.56 GB/s 🔴▼ -0.47% 1.11%
bidirectional_lockless/262144 kqueue bytes_per_sec 8.82 GB/s 8.80 GB/s 🔴▼ -0.39% 1.55%
bidirectional_lockless/4096 kqueue bytes_per_sec 1.82 GB/s 1.82 GB/s 🔴▼ -0.27% 0.70%
bidirectional_lockless/65536 kqueue bytes_per_sec 7.63 GB/s 7.62 GB/s 🔴▼ -0.33% 1.62%
multithread/2 kqueue bytes_per_sec 7.66 GB/s 7.37 GB/s 🔴▼ -1.13% 4.67%
multithread/4 kqueue bytes_per_sec 3.52 GB/s 3.67 GB/s 🟢▲ +3.73% 6.98%
multithread/8 kqueue bytes_per_sec 3.16 GB/s 3.16 GB/s 🟢▲ +4.47% 9.18%
unidirectional/1024 kqueue bytes_per_sec 460.2 MB/s 450.9 MB/s 🔴▼ -2.38% 2.88%
unidirectional/1048576 kqueue bytes_per_sec 9.03 GB/s 8.78 GB/s 🔴▼ -0.25% 5.49%
unidirectional/16384 kqueue bytes_per_sec 4.44 GB/s 4.39 GB/s 🔴▼ -1.51% 2.86%
unidirectional/262144 kqueue bytes_per_sec 8.90 GB/s 8.91 GB/s 🟢▲ +0.39% 1.73%
unidirectional/4096 kqueue bytes_per_sec 1.78 GB/s 1.79 GB/s 🟢▲ +0.25% 0.99%
unidirectional/65536 kqueue bytes_per_sec 7.37 GB/s 7.27 GB/s 🔴▼ -1.30% 2.28%
unidirectional_lockless/1024 kqueue bytes_per_sec 475.1 MB/s 471.9 MB/s ⚪ 0.00% 2.13%
unidirectional_lockless/1048576 kqueue bytes_per_sec 9.03 GB/s 8.82 GB/s 🔴▼ -0.32% 5.27%
unidirectional_lockless/16384 kqueue bytes_per_sec 4.48 GB/s 4.45 GB/s 🔴▼ -0.59% 1.57%
unidirectional_lockless/262144 kqueue bytes_per_sec 8.94 GB/s 9.00 GB/s 🔴▼ -1.48% 2.60%
unidirectional_lockless/4096 kqueue bytes_per_sec 1.81 GB/s 1.80 GB/s 🔴▼ -0.31% 1.64%
unidirectional_lockless/65536 kqueue bytes_per_sec 7.40 GB/s 7.33 GB/s 🔴▼ -1.41% 1.90%

Run & raw JSON artifacts · flag rule: |median Δ| > max(2%, 3×CV of the noisier side) · advisory only

Destroying a context is correct only if every suspended frame is
destroyed while the services still exist: work left for the
scheduler's last drain can reach an I/O object whose service is
already gone. Each service gives up its work in shutdown(), so nothing
should be left by then.

A new test parks chains on a timer, a socket read, an accept and a
signal wait, in frames that hold their I/O objects or own them, on a
strand, and on POSIX behind a blocking-pool worker. A service created
last, and so destroyed first, records that every frame was already
destroyed when the services began to go.

The scheduler destructors' last drain stays as a backstop for work
posted after the shutdown drain, and their comments now say so.
The io_context destructor note, the I/O context guide and the lifetime
design note described work posted after the services shut down as an
ordinary part of teardown. Every service gives up its work in
shutdown() and posts nothing from its destructor, so the scheduler's
last drain is only a backstop; the three now say so, and the design
note says why work reaching it must not use the destroyed services.
The comment said it catches a pool created after the context's
shutdown walk, whose shutdown() is never called. The context now
shuts such a pool down as it is created, and a post after shutdown()
starts no worker, so the destructor's join is only a guard.
@sgerbino
sgerbino merged commit 3efd699 into cppalliance:develop Oct 21, 2026
48 checks passed
@sgerbino
sgerbino deleted the pr/shutdown-once branch October 21, 2026 12:11
@github-project-automation github-project-automation Bot moved this from Backlog to Done in Beast2 Oct 21, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

Give up all work in shutdown() so io_context teardown does not depend on service order

2 participants