Ivan FB 7764b2f43b
fix C++ "async" methods spawn a thread per call that then blocks on a condvar (cpp.nim:362–377). std::async(std::launch::async, ...) forces a fresh thread, and the body runs
the blocking ffi_call_ which waits on a condvar with the user's timeout (default 30s). Under load this is a thread-explosion factory, and the name "async" is misleading — the
  Rust side has real async via tokio oneshot, but the C++ side has fake async. If true async isn't reachable in C++ without coroutines, fine, but at least pool the threads or
  document this is just a convenience wrapper.
2026-05-11 21:44:53 +02:00
..
2026-05-10 11:38:41 +02:00

nim_timer example

This example is a self-contained Nimble project demonstrating how to import nim-ffi and use the .ffiCtor. / .ffi. abstraction.

Usage

  1. Change into the example directory:

    cd examples/nim_timer
    
  2. Install the local ffi dependency:

    nimble install -y ../..
    
  3. Build the example library:

    nimble build
    
  4. Generate bindings:

    nimble genbindings_rust
    nimble genbindings_cpp
    

Rust example clients

The Rust client lives in examples/nim_timer/rust_client.

  • Run the sync example:

    cd examples/nim_timer/rust_client
    cargo run --bin rust_client
    
  • Run the Tokio example:

    cd examples/nim_timer/rust_client
    cargo run --bin tokio_client
    

C++ example

The generated C++ example lives in examples/nim_timer/cpp_bindings.

Build and run it with:

cd examples/nim_timer/cpp_bindings
cmake -S . -B build
cmake --build build
./build/example