feat(rust): port program timing helpers
Move the implementation of programs/timefn.c into rust/src/timefn.rs. The file provides the monotonic nanosecond clock (UTIL_getTime, span helpers, UTIL_waitForNextTick, UTIL_support_MT_measurements) used by the CLI and by several C test tools. timefn.c remains as a declaration-only shim so the original source lists and header configuration keep working, and it pins the ABI with static asserts: UTIL_time_t is returned by value and must stay a plain 64-bit counter, which the Rust #[repr(C)] mirror also asserts. Platform selection mirrors the C preprocessor structure: Windows uses QueryPerformanceCounter, Apple targets use mach_absolute_time, and other POSIX systems use libc clock_gettime(CLOCK_MONOTONIC). Only the unix path is exercised by this environment; the Windows and Apple paths are written from the C source and compile-checked logically but are untested here. The C90 clock() fallback is unreachable on Rust-supported targets, so multi-threaded measurement support is always reported. The symbols live in the program-only zstd-cli-rs package, keeping them out of library builds. Linking that archive into C test binaries surfaced a structural problem: rustc's local ThinLTO promotes internal symbols across codegen units, so extracting the timefn object could drag in the zstd_cli parser object, whose FIO_* externs test binaries cannot satisfy. The parser is therefore gated behind a new additive `cli` cargo feature (default on). Program archives build with cli,compression,decompression as before, while tests/Makefile links a helpers-only archive (rust/target/cli-helpers) built with --no-default-features, which contains no fileio references at all. tests/Makefile gains build rules for the helpers archive and adds it as a prerequisite of every binary that compiles the timefn shim: fullbench(32), fullbench-lib, fullbench-dll, fuzzer(32), zstreamtest(32/asan/tsan/ubsan), paramgrill, decodecorpus, and poolTests. Prerequisite order places the archive after all C objects in `$^` link lines; the known-broken -dll recipes filter to %.c, so they name the archive explicitly. Original C test sources are untouched; only link inputs changed. zstd-cli-rs now depends on libc (already used by the core crate) for clock_gettime and the Mach timebase bindings. Test Plan: - cd rust && cargo fmt --check && cargo clippy --all-targets -- -D warnings && cargo test --all-targets && cargo build --release - cd rust/cli && cargo fmt --check && cargo clippy --all-targets -- -D warnings && cargo test --all-targets; repeat tests with --no-default-features plus features compression / decompression / (none) - make -C programs zstd; roundtrip echo hello | zstd | zstd -d - make -C tests fullbench fuzzer zstreamtest paramgrill decodecorpus poolTests; ./tests/fullbench -i0; ./tests/fuzzer -i1 --no-big-tests; ./tests/poolTests; make -C tests test-rust-lib-smoke - verified with nm that the helpers archive member defining UTIL_getTime has no FIO_*/ZSTD_* undefined references Refs: rust/README.md
This commit is contained in:
+8
-2
@@ -59,6 +59,11 @@ zstd ABI:
|
||||
so library builds do not acquire program-only dependencies. The C
|
||||
`fileio` backend still owns file opening, safe replacement, sparse writes,
|
||||
metadata, and streaming I/O.
|
||||
- `timefn` provides the monotonic nanosecond clock behind `UTIL_time_t`.
|
||||
It also lives in the `cli/` package, but C test binaries (fullbench,
|
||||
fuzzer, zstreamtest, paramgrill, ...) link a helpers-only build of that
|
||||
archive, produced without the package's `cli` feature, because the parser
|
||||
layer requires the C `fileio` backend that tests do not compile.
|
||||
|
||||
The optimal block matcher, high-level frame compression, dictionary-building,
|
||||
legacy decoding callbacks, and the CLI file-I/O backend are still C. They must
|
||||
@@ -99,8 +104,9 @@ from `rust/cli` as well:
|
||||
```sh
|
||||
cargo clippy --all-targets -- -D warnings
|
||||
cargo test --all-targets
|
||||
cargo test --no-default-features --features compression --all-targets
|
||||
cargo test --no-default-features --features decompression --all-targets
|
||||
cargo test --no-default-features --features cli,compression --all-targets
|
||||
cargo test --no-default-features --features cli,decompression --all-targets
|
||||
cargo test --no-default-features --all-targets
|
||||
```
|
||||
|
||||
Then run original compatibility tests from the repository root, starting with
|
||||
|
||||
Reference in New Issue
Block a user