From a051e043fda4cfe4abc27926ab5b4cf20c219e9b Mon Sep 17 00:00:00 2001 From: wokron Date: Fri, 12 Jun 2026 10:14:46 +0800 Subject: [PATCH 1/7] use ubuntu 26.04 --- .github/workflows/build-and-test-latest-kernel.yml | 2 +- .github/workflows/build-and-test-liburing-versions.yml | 2 +- .github/workflows/build-and-test.yml | 2 +- .github/workflows/deploy-gh-pages.yaml | 4 ++-- .github/workflows/static-check.yml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build-and-test-latest-kernel.yml b/.github/workflows/build-and-test-latest-kernel.yml index bf8295b7..076000aa 100644 --- a/.github/workflows/build-and-test-latest-kernel.yml +++ b/.github/workflows/build-and-test-latest-kernel.yml @@ -17,7 +17,7 @@ env: jobs: build-and-test: - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 timeout-minutes: 30 steps: diff --git a/.github/workflows/build-and-test-liburing-versions.yml b/.github/workflows/build-and-test-liburing-versions.yml index 3161ce7b..47d3cba2 100644 --- a/.github/workflows/build-and-test-liburing-versions.yml +++ b/.github/workflows/build-and-test-liburing-versions.yml @@ -14,7 +14,7 @@ on: jobs: build-and-test: - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 timeout-minutes: 15 strategy: diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index ffbdda15..50da10f5 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -17,7 +17,7 @@ env: jobs: build-and-test: - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 timeout-minutes: 15 strategy: diff --git a/.github/workflows/deploy-gh-pages.yaml b/.github/workflows/deploy-gh-pages.yaml index 2ee7e297..61681144 100644 --- a/.github/workflows/deploy-gh-pages.yaml +++ b/.github/workflows/deploy-gh-pages.yaml @@ -19,7 +19,7 @@ concurrency: jobs: build: - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 timeout-minutes: 15 steps: @@ -65,7 +65,7 @@ jobs: deploy: needs: build - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} diff --git a/.github/workflows/static-check.yml b/.github/workflows/static-check.yml index 45f5e26b..e46ef784 100644 --- a/.github/workflows/static-check.yml +++ b/.github/workflows/static-check.yml @@ -14,7 +14,7 @@ on: jobs: static-check: - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 timeout-minutes: 10 steps: From 87b5716271a5be091d8086292a6bf9fbd2d28e22 Mon Sep 17 00:00:00 2001 From: wokron Date: Fri, 12 Jun 2026 14:38:23 +0800 Subject: [PATCH 2/7] fix doctest warning --- third_party/doctest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/third_party/doctest b/third_party/doctest index 1da23a3e..d44d4f6e 160000 --- a/third_party/doctest +++ b/third_party/doctest @@ -1 +1 @@ -Subproject commit 1da23a3e8119ec5cce4f9388e91b065e20bf06f5 +Subproject commit d44d4f6e66232d716af82f00a063759e9d0e50d6 From 0b5bc4c941da3c30b27cc1efd229a5421af65cad Mon Sep 17 00:00:00 2001 From: wokron Date: Fri, 12 Jun 2026 15:05:17 +0800 Subject: [PATCH 3/7] fix gcc false positive --- CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 69b3be2d..b55cc5ed 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -59,6 +59,9 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "GNU") # False positive with GCC # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109224 add_compile_options(-Wno-mismatched-new-delete) + # False positive with GCC: coroutine frame variables (e.g. + # structured bindings from co_await) are reported as maybe-uninitialized + add_compile_options(-Wno-maybe-uninitialized) endif() if(BUILD_EXAMPLES) From 33400ff81ff12b909b954942a2c72a5b1aa1e093 Mon Sep 17 00:00:00 2001 From: wokron Date: Fri, 12 Jun 2026 15:09:46 +0800 Subject: [PATCH 4/7] fix busybox sigill --- scripts/vm-run.sh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/scripts/vm-run.sh b/scripts/vm-run.sh index 76a07d4a..2a68fe6e 100644 --- a/scripts/vm-run.sh +++ b/scripts/vm-run.sh @@ -98,9 +98,16 @@ if [ "$QUIET_MODE" = true ]; then KERNEL_ARGS="$KERNEL_ARGS quiet" fi +# Use the maximum CPU feature set available to QEMU. +CPU_MODEL="max" +if [ "$KVM_ENABLED" = true ]; then + CPU_MODEL="host" +fi + # Run the VM, qemu-system-x86_64 \ $KVM_FLAG \ + -cpu "$CPU_MODEL" \ -smp 4 \ -m 512M \ -kernel "$KERNEL_IMAGE" \ From bee1a92efd5f553785916abb965a60bcd9d15877 Mon Sep 17 00:00:00 2001 From: wokron Date: Fri, 12 Jun 2026 15:34:15 +0800 Subject: [PATCH 5/7] fix newer format --- include/condy/task.hpp | 4 ++-- tests/test_async_operations.1.cpp | 6 +++--- tests/test_async_operations.2.cpp | 20 ++++++++++---------- tests/test_async_operations.3.cpp | 12 ++++++------ tests/test_async_operations.4.cpp | 18 ++++++++---------- 5 files changed, 29 insertions(+), 31 deletions(-) diff --git a/include/condy/task.hpp b/include/condy/task.hpp index f45254cd..5ece3c4c 100644 --- a/include/condy/task.hpp +++ b/include/condy/task.hpp @@ -61,8 +61,8 @@ class [[nodiscard]] Task : public detail::TaskBase { }; template -class [[nodiscard]] Task - : public detail::TaskBase { +class [[nodiscard]] +Task : public detail::TaskBase { public: using Base = detail::TaskBase; using Base::Base; diff --git a/tests/test_async_operations.1.cpp b/tests/test_async_operations.1.cpp index 76624a97..5977b0c2 100644 --- a/tests/test_async_operations.1.cpp +++ b/tests/test_async_operations.1.cpp @@ -75,7 +75,7 @@ TEST_CASE("test async_operations - recvmsg multishot") { }; auto func = [&]() -> condy::Coro { - struct msghdr msg_hdr {}; + struct msghdr msg_hdr{}; msg_hdr.msg_iov = nullptr; msg_hdr.msg_iovlen = 0; @@ -1162,7 +1162,7 @@ TEST_CASE("test async_operations - test recvmsg - basic") { ssize_t r = write(sv[1], msg.data(), msg.size()); REQUIRE(r == msg.size()); auto func = [&]() -> condy::Coro { - struct msghdr msg_hdr {}; + struct msghdr msg_hdr{}; char buf_storage[1024]; iovec iov{ .iov_base = buf_storage, @@ -1195,7 +1195,7 @@ TEST_CASE("test async_operations - test recvmsg - multishot") { close(sv[1]); auto func = [&]() -> condy::Coro { - struct msghdr msg_hdr {}; + struct msghdr msg_hdr{}; size_t count = 0; std::string actual; diff --git a/tests/test_async_operations.2.cpp b/tests/test_async_operations.2.cpp index 790763f0..38d4c8f6 100644 --- a/tests/test_async_operations.2.cpp +++ b/tests/test_async_operations.2.cpp @@ -30,7 +30,7 @@ TEST_CASE("test async_operations - test sendmsg - basic") { auto msg = generate_data(1024); auto func = [&]() -> condy::Coro { - struct msghdr msg_hdr {}; + struct msghdr msg_hdr{}; iovec iov{ .iov_base = const_cast(msg.data()), .iov_len = msg.size(), @@ -58,7 +58,7 @@ TEST_CASE("test async_operations - test sendmsg - zero copy") { auto msg = generate_data(1024); auto func = [&]() -> condy::Coro { - struct msghdr msg_hdr {}; + struct msghdr msg_hdr{}; iovec iov{ .iov_base = const_cast(msg.data()), .iov_len = msg.size(), @@ -90,7 +90,7 @@ TEST_CASE("test async_operations - test sendmsg - zero copy fixed buffer") { auto msg = generate_data(1024); auto func = [&]() -> condy::Coro { - struct msghdr msg_hdr {}; + struct msghdr msg_hdr{}; iovec iov{ .iov_base = msg.data(), .iov_len = msg.size(), @@ -221,7 +221,7 @@ TEST_CASE("test async_operations - test accept - basic") { auto main = [&]() -> condy::Coro { std::jthread client_thread(client); - struct sockaddr_in addr {}; + struct sockaddr_in addr{}; socklen_t addrlen = sizeof(addr); for (int i = 0; i < 4; i++) { int conn_fd = co_await condy::async_accept( @@ -265,7 +265,7 @@ TEST_CASE("test async_operations - test accept - direct") { condy::current_runtime().fd_table().init(2); - struct sockaddr_in addr {}; + struct sockaddr_in addr{}; socklen_t addrlen = sizeof(addr); int fd1 = co_await condy::async_accept_direct( listen_fd, (sockaddr *)&addr, &addrlen, 0, CONDY_FILE_INDEX_ALLOC); @@ -317,7 +317,7 @@ TEST_CASE("test async_operations - test accept - multishot") { std::jthread client_thread(client); size_t count = 0; - struct sockaddr_in addr {}; + struct sockaddr_in addr{}; socklen_t addrlen = sizeof(addr); condy::Channel done_channel(1); @@ -369,7 +369,7 @@ TEST_CASE("test async_operations - test accept - multishot direct") { fd_table.init(4); size_t count = 0; - struct sockaddr_in addr {}; + struct sockaddr_in addr{}; socklen_t addrlen = sizeof(addr); condy::Channel done_channel(1); @@ -554,7 +554,7 @@ TEST_CASE("test async_operations - test fallocate - basic") { }; condy::sync_wait(func()); - struct stat st {}; + struct stat st{}; int r = fstat(fd, &st); REQUIRE(r == 0); REQUIRE(st.st_size == 1024 * 1024); @@ -581,7 +581,7 @@ TEST_CASE("test async_operations - test fallocate - fixed fd") { }; condy::sync_wait(func()); - struct stat st {}; + struct stat st{}; int r = fstat(fd, &st); REQUIRE(r == 0); REQUIRE(st.st_size == 1024 * 1024); @@ -944,7 +944,7 @@ TEST_CASE("test async_operations - test statx") { auto d = condy::detail::defer([&] { unlink(name); }); auto func = [&]() -> condy::Coro { - struct statx stx {}; + struct statx stx{}; int r = co_await condy::async_statx(AT_FDCWD, name, 0, STATX_SIZE, &stx); REQUIRE(r == 0); diff --git a/tests/test_async_operations.3.cpp b/tests/test_async_operations.3.cpp index ff28051f..a5b90f5e 100644 --- a/tests/test_async_operations.3.cpp +++ b/tests/test_async_operations.3.cpp @@ -831,7 +831,7 @@ TEST_CASE("test async_operations - test openat2 - basic") { auto d = condy::detail::defer([&] { unlink(name); }); auto func = [&]() -> condy::Coro { - struct open_how how {}; + struct open_how how{}; how.flags = O_RDONLY; how.mode = 0; @@ -853,7 +853,7 @@ TEST_CASE("test async_operations - test openat2 - direct") { auto &fd_table = condy::current_runtime().fd_table(); fd_table.init(1); - struct open_how how {}; + struct open_how how{}; how.flags = O_RDONLY; how.mode = 0; @@ -915,7 +915,7 @@ TEST_CASE("test async_operations - test unlinkat") { }; condy::sync_wait(func()); - struct stat st {}; + struct stat st{}; int r = stat(name, &st); REQUIRE(r == -1); REQUIRE(errno == ENOENT); @@ -933,7 +933,7 @@ TEST_CASE("test async_operations - test unlink") { }; condy::sync_wait(func()); - struct stat st {}; + struct stat st{}; int r = stat(name, &st); REQUIRE(r == -1); REQUIRE(errno == ENOENT); @@ -959,7 +959,7 @@ TEST_CASE("test async_operations - test renameat") { }; condy::sync_wait(func()); - struct stat st {}; + struct stat st{}; int r = stat(old_name, &st); REQUIRE(r == -1); REQUIRE(errno == ENOENT); @@ -987,7 +987,7 @@ TEST_CASE("test async_operations - test rename") { }; condy::sync_wait(func()); - struct stat st {}; + struct stat st{}; int r = stat(old_name, &st); REQUIRE(r == -1); REQUIRE(errno == ENOENT); diff --git a/tests/test_async_operations.4.cpp b/tests/test_async_operations.4.cpp index fe1a598a..85b2be7a 100644 --- a/tests/test_async_operations.4.cpp +++ b/tests/test_async_operations.4.cpp @@ -37,7 +37,7 @@ TEST_CASE("test async_operations - test mkdirat") { }; condy::sync_wait(func()); - struct stat st {}; + struct stat st{}; int r = stat(name, &st); REQUIRE(r == 0); REQUIRE(S_ISDIR(st.st_mode)); @@ -53,7 +53,7 @@ TEST_CASE("test async_operations - test mkdir") { }; condy::sync_wait(func()); - struct stat st {}; + struct stat st{}; int r = stat(name, &st); REQUIRE(r == 0); REQUIRE(S_ISDIR(st.st_mode)); @@ -126,8 +126,7 @@ TEST_CASE("test async_operations - test linkat") { }; condy::sync_wait(func()); - struct stat st1 { - }, st2{}; + struct stat st1{}, st2{}; int r = stat(target_name, &st1); REQUIRE(r == 0); r = stat(link_name, &st2); @@ -152,8 +151,7 @@ TEST_CASE("test async_operations - test link") { }; condy::sync_wait(func()); - struct stat st1 { - }, st2{}; + struct stat st1{}, st2{}; int r = stat(target_name, &st1); REQUIRE(r == 0); r = stat(link_name, &st2); @@ -624,7 +622,7 @@ TEST_CASE("test async_operations - test cmd_getsockname - basic") { int listen_fd = create_accept_socket(); auto func = [&]() -> condy::Coro { - struct sockaddr_in addr {}; + struct sockaddr_in addr{}; socklen_t addrlen = sizeof(addr); int r = co_await condy::async_cmd_getsockname( listen_fd, (struct sockaddr *)&addr, &addrlen, 0); @@ -648,7 +646,7 @@ TEST_CASE("test async_operations - test cmd_getsockname - fixed fd") { int r = co_await condy::async_files_update(&listen_fd, 1, 0); REQUIRE(r == 1); - struct sockaddr_in addr {}; + struct sockaddr_in addr{}; socklen_t addrlen = sizeof(addr); r = co_await condy::async_cmd_getsockname( condy::fixed(0), (struct sockaddr *)&addr, &addrlen, 0); @@ -794,7 +792,7 @@ TEST_CASE("test async_operations - test ftruncate - basic") { }; condy::sync_wait(func()); - struct stat st {}; + struct stat st{}; int r = stat(name, &st); REQUIRE(r == 0); REQUIRE(st.st_size == 4096); @@ -819,7 +817,7 @@ TEST_CASE("test async_operations - test ftruncate - fixed fd") { }; condy::sync_wait(func()); - struct stat st {}; + struct stat st{}; int r = stat(name, &st); REQUIRE(r == 0); REQUIRE(st.st_size == 4096); From 2d188bd2393f979e08b57e4a8e8e7fd08c46a0a3 Mon Sep 17 00:00:00 2001 From: wokron Date: Fri, 12 Jun 2026 19:52:59 +0800 Subject: [PATCH 6/7] fix crtp --- include/condy/detail/singleton.hpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/include/condy/detail/singleton.hpp b/include/condy/detail/singleton.hpp index d1fa0960..cc4477e2 100644 --- a/include/condy/detail/singleton.hpp +++ b/include/condy/detail/singleton.hpp @@ -11,14 +11,17 @@ namespace detail { template class ThreadLocalSingleton { public: - ThreadLocalSingleton() = default; - CONDY_DELETE_COPY_MOVE(ThreadLocalSingleton); static T ¤t() noexcept { static thread_local T instance; return instance; } + +private: + ThreadLocalSingleton() = default; + + friend T; }; } // namespace detail From 1167151eef4e8d76f0400804ace0f7f609524af0 Mon Sep 17 00:00:00 2001 From: wokron Date: Fri, 12 Jun 2026 21:41:40 +0800 Subject: [PATCH 7/7] fix newer clang-tidy --- scripts/check-all.sh | 2 +- tests/test_async_operations.3.cpp | 2 +- tests/test_buffers.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/check-all.sh b/scripts/check-all.sh index 58aab779..3cb93cf1 100644 --- a/scripts/check-all.sh +++ b/scripts/check-all.sh @@ -20,4 +20,4 @@ while getopts "h" opt; do esac done -run-clang-tidy -p build/ '^.*(benchmarks|examples|tests)/.*\.(hpp|cpp)$' +run-clang-tidy -p build/ -header-filter='include/condy/.*' '^.*(benchmarks|examples|tests)/.*\.(hpp|cpp)$' diff --git a/tests/test_async_operations.3.cpp b/tests/test_async_operations.3.cpp index a5b90f5e..f37326dd 100644 --- a/tests/test_async_operations.3.cpp +++ b/tests/test_async_operations.3.cpp @@ -803,7 +803,7 @@ TEST_CASE("test async_operations - test recv - bundled multishot") { close(sv[1]); auto [n2, bufs2] = co_await condy::async_recv_multishot( - sv[0], condy::bundled(pool), 0, [&](auto) { + sv[0], condy::bundled(pool), 0, [&](const auto &) { REQUIRE(false); // Should not be called }); REQUIRE(n2 == 512); diff --git a/tests/test_buffers.cpp b/tests/test_buffers.cpp index e92947e0..7ed6cff6 100644 --- a/tests/test_buffers.cpp +++ b/tests/test_buffers.cpp @@ -528,7 +528,7 @@ TEST_CASE("test buffers - provided buffer pool external memory") { void *ext_mem = mmap(nullptr, total, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, 0, 0); - REQUIRE(ext_mem != MAP_FAILED); + // REQUIRE(ext_mem != MAP_FAILED); { condy::ProvidedBufferPool pool(ext_mem, num_bufs, buf_size);