Changelog
View SourceAll notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[1.1.2] - 2026-05-10
Fixed
- SIGBUS handler no longer reads
__threadstorage on the signal path.iommap_nif.sois loaded viadlopen, so on FreeBSD (and any other platform whose dynamic loader allocates dlopened TLS lazily) reading a__threadvariable from a thread that has not yet executed iommap code can call__tls_get_addr, which in turn may callmalloc-- not async-signal-safe, leading to a crash on the next bus error. The protection state is now carried in apthread_key_tslot allocated eagerly by iommap NIF entry points; the handler does a plainpthread_getspecificand treats a NULL slot as "not in a protected region, chain to the previous handler". This is the second half of the SIGBUS-handler fix started in 1.1.1; the crash only showed up when iommap was paired with another NIF in the same BEAM (enough TLS pressure to push iommap's slot out of the static-TLS reserve).
Tests
- New
iommap_two_nif_testsmodule reproduces the FreeBSD segfault inside iommap. A test-only helper NIF (test/c_src/) registers its own resource types alongside iommap; the test runs the region_binary load pattern in a tight loop, both inline and from a dedicated worker process. Without the TLS fix this reliably crashed BEAM on FreeBSD 14.2 and 14.4 in CI; with the fix, all matrix entries pass.
[1.1.1] - 2026-05-10
Fixed
- SIGBUS handler chains to the previously-installed handler when fired outside any iommap-protected region. The earlier handler always longjmped through a thread-local sigjmp_buf even when no sigsetjmp had run, which caused process segfaults when iommap was loaded alongside other NIFs that perform mmap I/O.
IOMMAP_MODE_WRITEnow opens the fileO_RDWR. mmap with PROT_WRITE requires a readable fd; the previous O_WRONLY broke write-only mode at mmap time.pread/3andregion_binary/3reject write-only handles witheacces, matching the symmetric guard already inpwrite/3.pwrite/3now wraps its memcpy in the same enter/leave protected pair aspread/3so a SIGBUS during pwrite is reported as{error, sigbus}rather than chained to the default handler.
Tests
- New
read_close_then_parseandmany_open_close_cyclescases cover the read-onlyopen → region_binary → close → use binarypattern that downstream callers rely on. - FreeBSD CI now matrices 14.2 and 14.4.
1.1.0 - 2026-05-09
Added
iommap:region_binary/3returns a refcounted resource binary that points directly into the mapped region, with no data copy. Intended for hot zero-copy hand-off paths.
Changed
- The NIF resource layout was split into a
mappingresource (owns the mmap region and fd) and ahandleresource (owns the BEAM handle term and one reference to the mapping).close/1releases the handle's reference to the mapping;munmapandclose(fd)are deferred until any outstanding region binaries derived from that mapping are also garbage collected. Existing API behaviour is unchanged. truncate/2now allocates a fresh mapping (with a duplicated fd) and atomically swaps it into the handle. The previous mapping remains alive for outstanding region binaries.
Notes
region_binary/3is unsafe against external truncation that shrinks past a binary's range. Usepread/3when safety against external mutation is required.
1.0.0 - 2026-01-26
Added
- Initial release of iommap
- Dirty NIF I/O schedulers for all I/O operations
- Cross-platform memory-mapped file I/O for Erlang/OTP
- Support for Linux, macOS, FreeBSD, and OpenBSD
- Core operations:
open/2,3,close/1,pread/3,pwrite/3 - Synchronization:
sync/1,2with sync/async modes - File management:
truncate/2,position/1 - Memory advice:
advise/4with madvise hints - Thread-safe implementation using pthread rwlocks
- SIGBUS protection for external file truncation
- Platform-specific optimizations:
MAP_POPULATEsupport on LinuxMAP_NOCACHEsupport on macOSfallocateon Linux,posix_fallocateon BSD
- Comprehensive test suite with 20 tests
- CI pipeline for all supported platforms