Tags: jeffhuen/RustyCSV
Tags
Eliminate all unsafe from application code and bump to v0.3.5 - Replace hand-rolled enif_make_sub_binary FFI with rustler's safe Binary::make_subbinary().into() API (enabled by upstream PR #719) - Remove CLMUL (x86_64) and PMULL (aarch64) std::arch intrinsics from SIMD scanner; use portable shift-and-xor cascade on all targets (benchmarked with no measurable difference on 15MB/100K-row workloads) - Pin rustler dependency to git master pending 0.37.3 hex release - Update README, ARCHITECTURE, BENCHMARK, and CHANGELOG docs The only remaining unsafe is the GlobalAlloc trait impl behind the opt-in memory_tracking feature flag (benchmarking only, not for production use). Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Harden NIF safety and bump to v0.3.3 Replace all unwrap() calls in production Rust NIF code with match + early return, enforce with cfg_attr(not(test), deny(clippy::unwrap_used, clippy::expect_used)). Add cargo clippy and cargo test to CI. Add property-based tests (StreamData) and concurrent access tests. Update all moduledocs to document dirty CPU scheduling, concurrency safety, and dedicated rayon thread pool. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Harden NIF safety and bump to v0.3.2 Five internal safety fixes, all on by default with zero configuration: - Mutex poisoning recovery: streaming NIFs raise :mutex_poisoned instead of panicking the VM when a previous call panicked under the lock - Dirty CPU scheduling: 12 NIFs that process unbounded input now run on dirty CPU schedulers to avoid blocking normal BEAM schedulers - Sub-binary bounds check: make_subbinary validates start+len<=input_len with debug_assert and a release-mode empty-binary safety net - Dedicated rayon thread pool: parallel parsing uses a named rustycsv-* pool instead of the global rayon pool, avoiding contention - Bounded streaming buffer: 256 MB default cap with :buffer_overflow raise, configurable via :max_buffer_size option Also fixes Error::Term -> Error::RaiseTerm so buffer overflow and mutex poisoning actually raise exceptions instead of silently returning error tuples. Adds 12 new streaming safety tests and fixes a flawed assertion in edge_cases_test.exs that could never fail. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Bump version to 0.3.0 and fix all linter warnings - Version bump to 0.3.0 in mix.exs, Cargo.toml, README, CHANGELOG - Fix clippy: collapse else-if in zero_copy.rs, use &[u8] over &Cow - Fix cargo fmt across all Rust source files - Fix credo: reduce cyclomatic complexity by extracting quote blocks into separate functions, alphabetize aliases, use sigils for strings - Fix mix format across Elixir source files Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Bump to v0.2.0 ### Added - `:zero_copy` strategy using BEAM sub-binary references - SIMD-accelerated row boundary scanning via memchr3 - mimalloc high-performance allocator (enabled by default) - Optional memory tracking via `memory_tracking` Cargo feature - Comprehensive benchmark suite with honest methodology ### Changed - Memory tracking now opt-in (removes ~5-10% overhead when disabled) - `:parallel` strategy threshold updated to 500MB+ (based on crossover testing) - Documentation updated with accurate benchmark claims (3.5x-18x speedups) - "High-performance" → "Ultra-fast" branding ### Fixed - Benchmark methodology: fair streaming comparison, honest memory metrics - Corrected claims about NimbleCSV capabilities in README Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
PreviousNext