v0.9.3
Pre-release
Pre-release
Fixes correctness bugs in async profiling, allocation tracking, and self-time precision -- upgrading is recommended for anyone profiling async or high-call-count programs.
Added
- Signal handlers for SIGTERM and SIGINT recover profiling data on Unix instead of losing it (#257)
#[non_exhaustive]on all public runtime structs for forward-compatible API evolution (#258)- Internal injection API hidden from docs.rs to keep published documentation clean (#259)
- MIT LICENSE file (#248)
Fixed
- Allocation counters no longer corrupted when async futures are cancelled mid-await (#250)
- Unbounded memory growth for high-call-count programs: per-invocation records replaced with in-flight aggregation, bounding memory to O(unique functions) instead of O(total calls) (#251)
- Floating-point precision loss in self-time computation eliminated by using integer nanoseconds for children time accumulation (#253)
select!/join!and other macro invocations in async functions now treated as potential.awaitpoints for thread migration detection (#249)- Migrated async guards capture post-migration CPU time instead of reporting zero (#269)
- Allocation tracking correctly scoped to condition expressions for
if/while/matchwith.awaitin condition, so body allocations are not lost (#270) - Non-block match arms (
Some(v) => process(v)) now get allocation tracking when scrutinee contains.await(#292) - NDJSON runs no longer approximate
total_msfromself_ms; the field is set to 0.0 to honestly represent absent data (#254) FrameFnSummary.callswidened fromu32tou64to prevent overflow for high-call-count frames (#286)- IO errors now include file path and operation context instead of bare OS messages (#255)
flush()reports write errors to stderr instead of silently discarding them (#256)find_latest_binaryaccepts.exeextension on Windows (#252)