Skip to content

Repository files navigation

Condy🍬

C++ License Release Stars

CI (Main) CI (Latest Kernel) CI (Toolchain) CI (Static Check) CI (Execution) Deploy Docs

C++ Asynchronous System Call Layer for Linux, Powered by io_uring and C++20 Coroutines

Condy is designed to provide an intuitive, high-performance coroutine runtime on top of io_uring:

  • Comprehensive io_uring Integration Designed to integrate and maintain support for most io_uring features, with ongoing updates to track kernel and liburing advancements.

  • Low Overhead Efficient template-based abstractions and precise lifetime management eliminate nearly all heap allocations outside coroutine frames, resulting in extremely low runtime overhead.

  • Intuitive Programming Model Write asynchronous code in a direct, readable style using C++20 coroutines—no callbacks. Friendly APIs, high-level combinators, and channels make complex async flows easy to express.

  • Ready for std::execution Condy's senders satisfy the standard sender concept and compose directly with the C++26 execution ecosystem.

Quick Start

// hello.cpp
#include <condy.hpp>

condy::Coro<> co_main() {
    std::string msg = "Hello, Condy!\n";
    co_await condy::async_write(STDOUT_FILENO, condy::buffer(msg), 0);
}

int main() { condy::sync_wait(co_main()); }
# Make sure liburing (>=2.3) is installed on your system
# On Ubuntu: sudo apt install liburing-dev
c++ hello.cpp -o hello -std=c++20 -luring -I./include
./hello
# Hello, Condy!

See Documentation for more details.

Using std::execution

When a std::execution implementation is available, Condy's operations become standard senders and can be used from execution-style code. See Building and Usage for how to enable an implementation.

// hello_execution.cpp
#include <condy.hpp>
#include <string>
#include <thread>

// C++26; otherwise <stdexec/execution.hpp> or <beman/execution.hpp>
#include <execution>

namespace ex = /* ... */ ;

int main() {
    condy::Runtime runtime;
    std::jthread runtime_thread([&] { runtime.run(); });

    std::string msg = "Hello, Condy!\n";
    auto [r] = ex::sync_wait(ex::starts_on(
        condy::get_scheduler(runtime),
        condy::async_write(STDOUT_FILENO, condy::buffer(msg), 0))).value();

    runtime.allow_exit();
    return r < 0;
}

Documentation

Support

  • For questions, bug reports, or feature requests, please open an issue.
  • Pull requests are welcome!

About

C++ Asynchronous System Call Layer, Powered by io_uring and C++20 Coroutines

Topics

Resources

Stars

22 stars

Watchers

1 watching

Forks

Releases

Contributors

Languages