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.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.
- 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 fix that made the crashes only show up when iommap was paired with another NIF in the same BEAM (the helper NIF was enough TLS pressure to push iommap's slot out of the static-TLS reserve). 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. - 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. - 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