Releases: StormBytePP/StormByte-System
Release list
Version 2.0.0
[Summary]
StormByte System is the C++26 process, device and host layer of the StormByte suite.
It depends on StormByte-String 1.0.0 or newer, which vendors StormByte Base 2.0.0 or newer. This repository is not Base, Buffer, Config, Crypto, Database, Logger, Multimedia, Network or String.
Spawn children with piped stdin/stdout/stderr, classify the medium behind a path, resolve directories and the current executable, inspect the machine, name the calling thread, and expand environment strings. POSIX and Windows stay behind one API. Failures are StormByte::Error::Fault in a per-type domain (StormByte.System.*). Nothing in this module throws. Text that crosses a DLL boundary is StormByte::String::String / CString (and wide counterparts), not std::string by value.
From 2.0.0, original System sources are dual-licensed: GNU Lesser General Public License v3.0 or later, or a commercial license from the copyright holder. That change does not cover other StormByte modules or third-party material under thirdparty/ (including bundled StormByte-String and the Base tree it vendors).
If you landed here from a release link and have not read the tree:
- What this module is, how to build it, and short examples: README.md
- License: dual license LGPL-3.0-or-later or commercial, LICENSE
Added
- Device: classify the medium behind a path (
Kind,Accessbitmask, nominalThroughput, suggestedWindow).- Copyable; stores only the caller accessor as
StormByte::String::String. - Probe is on-demand.
operator boolis probe success, not permission. - Errors are
StormByte::System::Device::Errorin domainStormByte.System.Device, held asStormByte::Error::Fault.
- Copyable; stores only the caller accessor as
- Directory: current, home, temporary and current-executable directories.
bool+ outString;LastError()is TLS in this module. - File:
Temporary(prefix, suffix)creates an empty file the caller unlinks;CurrentExecutableis the running image. - Host: name, architecture, CPU brand, OS, kernel, page size, physical/available memory, logical processors, process bitness.
- ThisThread:
Sleep; get/set thread name (TooLongif the platform limit is exceeded; the name is not truncated). - Dual license on original System sources: LGPL-3.0-or-later or commercial (
LICENSE+COPYING.LGPLv3). STORMBYTE_SYSTEM_SHAREDCMake option (default ON) so a static Windows consumer does not seedllimport.
Changed
- Breaking: Process no longer throws. Spawn, wait and stdin failures are
StormByte::System::Process::Errorin domainStormByte.System.Process, held asFault().operator boolis true only while a child is live (RUNNINGorSUSPENDED).- Timed
WaitsetsTimedOutand leaves the child running. A second wait after a successful reap setsAlreadyExited. - A failed stdin write sets
BrokenPipe.
- Breaking:
Variable::ExpandreturnsStormByte::String::String. On Windows, a failedExpandEnvironmentStringsWreturns the original text (same as a missing UNIX home). - Breaking: Process constructor arguments are
std::vector<StormByte::String::String>. - Pipe construction and I/O no longer throw. Invalid pipes convert to
false. - Public text across a DLL boundary uses
StormByte::String::String/CString. - Depends on StormByte-String 1.0.0 (vendors Base 2.0.0).
- Visibility macros follow Base/Logger (
EXPORTS/STORMBYTE_SYSTEM_SHARED/ static empty). - Windows Device probe links
iphlpapiandws2_32. Host CPU name linksadvapi32. macOS Device probe links IOKit and CoreFoundation. - Breaking:
Host::PageSize,PhysicalMemoryandAvailableMemoryreturnByteSize. They are octet lengths. - Breaking:
Device::WindowisByteSize.Device::Throughputstores octets per second asByteSize, notstd::size_t. - Breaking:
Process::operator>>andStderrtakeStormByte::String::String, notstd::string. The captured text is owned by Base.operator<<(std::ostream&, const Process&)isSTORMBYTE_FORCE_INLINE, so the stream buffer grows in the caller.operator<<onProcessandPipeacceptsstd::string_viewandString.operator>>staysStringonly: a view cannot own the bytes that were read. - Process path. Both constructors copy
std::filesystem::pathinside the DLL. The rvalue overload no longer moves the caller buffer intom_program.
Removed
- Breaking:
StormByte/system/exception.hxx(Exception,FileIOError,ExecutableNotFound,ProcessCreationError). - Breaking:
StormByte::System::ErrorandStormByte/system/error.hxx(domainStormByte.System). Device, Process, Directory, File, Host and ThisThread keep their own domains.
Version 1.1.0
[Summary]
StormByte System is the C++26 process and environment layer of the StormByte suite.
Dependency baseline: StormByte (base) 1.1.0.
Spawn children with piped stdin/stdout/stderr, chain them, suspend/resume, and expand environment strings. POSIX and Windows stay behind one API.
Changed
- Public process behavior
- Ported System exception messages to the
StormByte::Componentformat and addedProcessCreationErrorfor process creation failures. - Added a public timed
Wait(std::chrono::milliseconds)overload; the existing untimed overload remains unchanged.
- Ported System exception messages to the
- Process pipeline internals
- Moved forwarding into the internal
Pipeabstraction while preserving buffered and future output. - Moved Process state into the private process implementation header, reducing public-header ABI exposure.
- Moved forwarding into the internal
- Dependencies and build configuration
- Updated the StormByte/base dependency to 1.1.0.
- Switched Windows release optimization handling to CMake interprocedural optimization without duplicate manual compiler/linker flags.
Fixed
- Pipe and process lifecycle
- Pipe construction now checks platform errors, normalizes UNIX descriptors, and moved pipes invalidate their source endpoints.
- Pipe reads, writes, polling, EOF handling, and descriptor binding now distinguish interruption, EOF, and failure.
- Process pipeline forwarding retains pipe ownership independently of Process lifetime, supports safe reconnection, and cancels without cross-thread descriptor closure.
- Process waiting no longer deadlocks on downstream backpressure; lifecycle joins handle unexpected thread errors without escaping
noexceptcleanup paths. - Direct writes, interrupted waits, and Windows wait failures now preserve error and ownership semantics.
- Process startup and platform handling
- UNIX startup reports
execvpfailures to the parent and throws the appropriate exception eagerly. - Windows startup quotes command-line arguments and distinguishes missing executables from other creation failures.
- Environment expansion handles missing home directories safely, expands only leading
~paths, and grows Windows buffers as needed.
- UNIX startup reports
- Regression coverage
- Added coverage for pipelines, process moves, signal termination, interrupted waits, descriptor reuse, consumer exit, direct write failures, and oversized Windows environment expansion.
- CI portability
- Fixed Windows-only Process implementation initialization.
- Made UNIX process tests resolve utilities through
PATHfor macOS portability.
Version 1.0.0
[Summary]
StormByte System is the C++26 process and environment layer of the StormByte suite.
Spawn children with piped stdin/stdout/stderr, chain them, suspend/resume, and expand environment strings. POSIX and Windows stay behind one API.
Initial public release of StormByte-System.
Added
- Process: run external programs with piped stdin / stdout / stderr
- Move-only ownership; starts on construction
Wait()for exit code (blocking, no timeout)Suspend()/Resume()- Stream operators: write stdin, read stdout,
<< System::EoFto close stdin - Process chaining (
p1 >> p2) via background forwarder Stderr()to read the stderr pipe- Cross-platform (POSIX fork/exec and Windows
CreateProcessW)
- Pipe (internal): anonymous pipes for IPC (UNIX
pipe/pipe2, WindowsCreatePipe)- Atomic chunked writes, bind/dup helpers, handle inheritance flags on Windows
- Variable: expand environment strings (Windows
ExpandEnvironmentStrings; UNIX~→ home) - Exceptions:
Exception,FileIOError,ExecutableNotFound - Unit tests for Linux, macOS and Windows (pipelines, stdin, exit codes, move)
Fixed
- Process move no longer double-waits the same child (ownership is fully transferred)
- Failed
execvpin the child uses_exit(127)instead of throwing acrossfork - Removed unimplemented
Pipe::BindRead(Pipe&)/BindWrite(Pipe&)declarations - Pipes owned with
std::unique_ptrinstead of rawnew/delete SIGPIPEignored once per process (not on every Pipe construction)WriteAtomictreats empty input as success- Windows command line built without a trailing space
Notes
- On UNIX, if the executable cannot be started, the child exits with status 127; the parent does not throw from the child path.
Wait()has no timeout; it blocks until the process ends.