Notable changes. This project follows semantic versioning from 0.1.0 onward; while the major version is 0, the runtime's C API and the knob names may still change, and any change that does will be listed here.
0.1.0 — 2026-08-22
First release as a project rather than a paper artifact. Everything the paper measured is preserved and still reproduces; what changed is that the code can now be built, tested and used by someone who did not write it.
- A build system.
makebuilds the runtime, the emulated backend and the examples, warning-free under-Wall -Wextraon gcc and clang.make checkruns the correctness suite,make demoreproduces the headline effect,make gpubuilds the CUDA backend,make installinstalls headers, libraries and a pkg-config file. Previously the only build instructions were gcc command lines embedded in prose in the results files. - A test suite. 13 tests, no GPU and no root required, finishing in under a minute: verified results with and without the runtime, proof the mechanism engaged rather than passing through, non-offloading passthrough safety, fiber-aware cond and rwlock, the shared-state hazard and both of its mitigations, and knob precedence. Every load run is bounded so a stall fails loudly instead of hanging.
- A documented public API.
include/toffload/accel.hspecifies the four-function backend contract.include/toffload/toffload.hadds an optional application-facing API — stats, yield, region watch — with every symbol weak, so a program links and runs whether or not the runtime is loaded. accel_run()as the backend entry point, withaccel_encrypt()kept as an alias. The old name is crypto-specific; the mechanism never was.- Configuration beyond environment variables. Knobs resolve
TOFFLOAD_<KNOB>, then the legacyRT_<KNOB>, then a file named byTOFFLOAD_CONFIG. File keys ignore case,-and_. - An opt-in stats interface.
TOFFLOAD_STATS=stderr[:seconds]or a file path, plustoffload_get_stats()for programmatic access. Eight counters including offloads, I/O yields and serializations, which did not exist before. - CI. Build and test on ubuntu-22.04 and 24.04 across gcc and clang, an ASan+UBSan job, an aarch64 cross-build proving the other supported architecture's assembly still compiles, shellcheck on the entry-point scripts, and an install job that compiles a consumer against the installed headers via pkg-config.
- Documentation: quickstart, architecture, a five-minute test for whether your server can benefit, writing a backend, the safety model, a full configuration reference, troubleshooting, reproducing the paper, and a path map from the published paper's paths to the current layout.
- Project files: contributing guide, code of conduct, security policy, roadmap, issue and PR templates, editorconfig and clang-format.
- Enforce mode deadlocked the runtime. The handler lock was released only
in
write(), so a connection that closed at EOF — whereread()returns 0 and the handler exits without responding — leaked it permanently, and every other fiber spun inhl_acquireforever. Reproduced as a hard hang withTOFFLOAD_ENFORCE=1at 16 connections. The lock is now reclaimed when a fiber completes. - Enforce mode starved every connection but one.
read()took the handler lock on entry rather than on the first byte of a request, so the holder kept it across the idle wait for its client's next request. The critical section now opens when data actually arrives. - Three example programs called
atoiwithout including<stdlib.h>. - A dead variable and two real compiler warnings in the runtime.
- Repository layout.
include/,src/,backends/,examples/,tests/,bench/anddocs/at the top; the research artifact preserved intact underexperiments/. This also removes the collision whereruntime/meant microbenchmarks whiletransparent-runtime/meant the runtime.git log --followworks across the move, and docs/paper-path-map.md translates every old path. - The runtime is quiet by default. It used to print a counter line every
couple of seconds and a summary at exit, unconditionally, into the host
process's stderr. Now it prints one banner on load (suppressible with
TOFFLOAD_QUIET) and nothing else unlessTOFFLOAD_STATSis set. - The fiber sources are no longer triplicated.
fw_fiber.c,fw_fiber.handfw_switch.Sexisted as three byte-identical copies; there is now one. make demoreports a median of three runs. A single run was noisy enough to produce impossible tables — stock faster at 100 µs than at 20 µs — which made the whole comparison untrustworthy.
RT_*environment variables all still work.accel_encrypt()still works and is still interposed.- Every path referenced by the published paper is mapped in docs/paper-path-map.md.