v1.14.0 — SWMR, live parallel filter pipeline, and HDF5 2.x read support
Highlights
SWMR is now supported on Linux with HDF5 1.12.3+.
New tags h5::swmr_write_t / h5::swmr_read_t open files in SWMR mode, and h5::start_swmr_write(fd) transitions a file to writer mode. Packet tables (h5::pt_t) automatically detect SWMR-write
intent and issue H5Dflush on h5::flush(pt), so readers see appended chunks without the caller holding a separate dataset handle (#267).
The parallel filter pipeline is live.
The FAPL-scoped worker pool (via h5::threads{N} and h5::backpressure{M}) is now carried through a fileno-keyed singleton registry, so pool_pipeline_t actually executes instead of falling
back to the synchronous path. Both write and read paths fan gzip/deflate across the process-global worker pool while H5Dwrite_chunk / H5Dread_chunk stay on the calling thread (#286, #287).
This resolves the known issue from v1.12.7.
HDF5 2.x chunk reads are now correct.
The H5Dread_chunk2 path honours the per-chunk filter_mask (so chunks stored without a filter are not "decompressed" into garbage) and sizes the read buffer with the real scratch bound
instead of the uncompressed nbytes (#298).
Multithread build mode is hardened.
Under -DH5CPP_MULTITHREAD, every HDF5 C-API call is serialized through a process-global recursive mutex, descriptors are conversion-off (no silent ::hid_t decay), and close paths route
through the same lock. The TSan-clean concurrent-writer and concurrent-appender tests exercise multiple producers writing distinct datasets into one file (#287).
Features
• #267 SWMR support — h5::swmr_write_t / h5::swmr_read_t file-open tags, h5::start_swmr_write(fd), automatic H5Dflush from h5::flush(pt), and a full example suite under examples/swmr/.
• #287 async / multithread write path — per-file io_collector_t, process-global worker pool, and DAPL-based h5::threads{N} / h5::backpressure{M} tags. Concurrent writers to one file are
TSan-clean.
• #287 parallel read path — rank-1 chunked datasets decompress across the worker pool when opened with h5::threads{N}.
• #286 fileno-keyed worker-pool registry — carries the pool across H5Fget_access_plist round-trips, finally activating pool_pipeline_t.
• #298 HDF5 2.x H5Dread_chunk2 support — correct filter_mask handling and buffer sizing for HDF5 ≥ 2.0.
Fixes
• #298 chunked-filter read on HDF5 2.x ignored filter_mask and passed an undersized buffer, corrupting or failing reads.
• #286 h5::threads{N} was silently inert because H5Fget_access_plist stripped the inserted property before the write/read dispatch resolved the pool.
• #287 hardened the multithread boundary: conversion-off handles, global recursive capi_lock, and collector-routed closes.
• #282 Doxygen reference updated to v1.12.7, dangling \refs fixed, and warnings driven from 327 → 0.
• CI workflow updated for the windows-2025-vs2026 runner image.
Architecture / Refactoring
• #267 added H5Fswmr.hpp and the H5CPP_HAS_SWMR feature gate (Linux / HDF5 1.12.3+).
• #287 refactored the pipeline dispatch: basic_pipeline_t vs pool_pipeline_t selected by DAPL property, with back-pressure bounded by an in-flight future deque.
• #286 removed the old FAPL-property pool carry in favour of a per-physical-file registry keyed by H5Fget_fileno.
Compatibility Notes
• SWMR is gated to Linux + HDF5 1.12.3+; other platforms fall back to classic file-open semantics.
• The public h5::read / h5::write / h5::append surface is unchanged. h5::threads{N} and h5::backpressure{M} are additive DAPL properties.
• Multithread safety requires building with -DH5CPP_MULTITHREAD; classic single-threaded builds are zero-overhead pass-throughs.
Full Changelog
v1.12.7...v1.14.0