SubEtha.psd1

@{
    RootModule = 'SubEtha.psm1'
    ModuleVersion = '0.6.0'
    CompatiblePSEditions = @('Desktop', 'Core')
    GUID = '17623a25-8516-42f6-b752-759fc4d553cd'
    Author = 'Mark Newton'
    CompanyName = 'Variably Constant'
    Copyright = 'Copyright (c) 2026 Mark Newton'
    Description = 'Shared memory between processes, as PowerShell cmdlets and objects. Rings, queues, channels, locks, atomics, counters and shared collections that several processes on one machine read and write at the same time, each backed by a memory-mapped file that outlives the session that made it. A New- cmdlet makes one and an Open- cmdlet attaches to one another process has already made; the object either one returns carries the operations as methods, and Send-SubEthaItem and Receive-SubEthaItem move items through the pipeline. Bytes cross as byte[] pinned in place rather than copied, and a lock or a hold comes back as an object that releases on Release(), Dispose() or collection. Every cmdlet answers to a shorter name with the SE prefix. Bound directly to Rust with PoWerRuSt (pwrs), Rust bindings for writing PowerShell binary modules in the spirit of PyO3: the cmdlets are the library, not a wrapper over a command line. Windows x64, Linux x64, macOS arm64 and FreeBSD x64 in one module, on PowerShell 7 and Windows PowerShell 5.1. Source and issues at https://github.com/Variably-Constant/SubEtha; the binding framework at https://github.com/Variably-Constant/PWRS and https://crates.io/crates/PoWerRuSt.'
    PowerShellVersion = '5.1'
    FormatsToProcess = @('SubEtha.Format.ps1xml')
    FunctionsToExport = @()
    CmdletsToExport = @('New-SubEthaAtomic', 'Open-SubEthaAtomic', 'New-SubEthaRegion', 'Open-SubEthaRegion', 'New-SubEthaCell', 'Open-SubEthaCell', 'New-SubEthaVec', 'Open-SubEthaVec', 'New-SubEthaSharedArc', 'Open-SubEthaSharedArc', 'New-SubEthaLazyValue', 'Open-SubEthaLazyValue', 'New-SubEthaBitVec', 'Open-SubEthaBitVec', 'New-SubEthaSpscRing', 'Open-SubEthaSpscRing', 'New-SubEthaBroadcastRing', 'Open-SubEthaBroadcastRing', 'New-SubEthaCapacityRing', 'Open-SubEthaCapacityRing', 'New-SubEthaLocaleRing', 'Open-SubEthaLocaleRing', 'New-SubEthaRing', 'Open-SubEthaRing', 'New-SubEthaReorderWindow', 'New-SubEthaStack', 'Open-SubEthaStack', 'New-SubEthaDeque', 'Open-SubEthaDeque', 'New-SubEthaPubSub', 'Open-SubEthaPubSub', 'New-SubEthaLamportPair', 'New-SubEthaFrameRegion', 'Open-SubEthaFrameRegion', 'New-SubEthaArena', 'Open-SubEthaArena', 'New-SubEthaLinkedList', 'Open-SubEthaLinkedList', 'New-SubEthaSlab', 'Open-SubEthaSlab', 'New-SubEthaBTreeMap', 'Open-SubEthaBTreeMap', 'New-SubEthaHashMap', 'Open-SubEthaHashMap', 'New-SubEthaMpscPool', 'New-SubEthaMpmcGrid', 'New-SubEthaNotifierSet', 'New-SubEthaLeaderElection', 'Open-SubEthaLeaderElection', 'New-SubEthaHolderTable', 'Open-SubEthaHolderTable', 'New-SubEthaHeartbeat', 'Open-SubEthaHeartbeat', 'New-SubEthaEpochBarrier', 'Open-SubEthaEpochBarrier', 'New-SubEthaCondvar', 'Open-SubEthaCondvar', 'Wait-SubEthaCondition', 'New-SubEthaFenceClock', 'Open-SubEthaFenceClock', 'New-SubEthaEpochs', 'Open-SubEthaEpochs', 'New-SubEthaRWLock', 'Open-SubEthaRWLock', 'New-SubEthaSemaphore', 'Open-SubEthaSemaphore', 'New-SubEthaOwnerLease', 'Open-SubEthaOwnerLease', 'New-SubEthaBloomFilter', 'Open-SubEthaBloomFilter', 'Measure-SubEthaBloomSize', 'New-SubEthaBlockedBloomFilter', 'Open-SubEthaBlockedBloomFilter', 'New-SubEthaHyperLogLog', 'Open-SubEthaHyperLogLog', 'New-SubEthaCountMinSketch', 'Open-SubEthaCountMinSketch', 'Measure-SubEthaSketchSize', 'New-SubEthaHistogram', 'Open-SubEthaHistogram', 'New-SubEthaRateLimiter', 'Open-SubEthaRateLimiter', 'New-SubEthaLruCache', 'Open-SubEthaLruCache', 'New-SubEthaReservoir', 'Open-SubEthaReservoir', 'New-SubEthaHandleTable', 'Open-SubEthaHandleTable', 'New-SubEthaTimePointTile', 'Open-SubEthaTimePointTile', 'New-SubEthaVersionChain', 'Open-SubEthaVersionChain', 'New-SubEthaVersionedSlab', 'Open-SubEthaVersionedSlab', 'New-SubEthaVersionedMap', 'Open-SubEthaVersionedMap', 'New-SubEthaLanedMap', 'Open-SubEthaLanedMap', 'New-SubEthaTopologyMap', 'Open-SubEthaTopologyMap', 'New-SubEthaGraph', 'Open-SubEthaGraph', 'New-SubEthaUniversal', 'Open-SubEthaUniversal', 'New-SubEthaTower', 'Open-SubEthaTower', 'New-SubEthaChannel', 'Open-SubEthaChannel', 'New-SubEthaAdaptiveQueue', 'New-SubEthaWorkQueue', 'Open-SubEthaWorkQueue', 'New-SubEthaKvMap', 'New-SubEthaQosPolicy', 'New-SubEthaTinyBloom', 'New-SubEthaFineBloom', 'New-SubEthaClock', 'New-SubEthaCausalClock', 'New-SubEthaSensSender', 'New-SubEthaSensReceiver', 'New-SubEthaLossKind', 'New-SubEthaLossBursts', 'New-SubEthaTiming', 'New-SubEthaRoundTripShape', 'New-SubEthaPeriodicity', 'New-SubEthaCapacity', 'New-SubEthaForecast', 'New-SubEthaPathChanges', 'New-SubEthaTcpBridgeClient', 'New-SubEthaTcpBridgeServer', 'New-SubEthaSelfSignedCert', 'New-SubEthaQuicBridgeClient', 'New-SubEthaQuicBridgeServer', 'Get-SubEthaTransport', 'Send-SubEthaItem', 'Receive-SubEthaItem', 'New-SubEthaAdaptive', 'Get-SubEthaSidecar', 'Set-SubEthaSidecar', 'Invoke-SubEthaSidecarScan')
    VariablesToExport = @()
    AliasesToExport = @('New-SEAtomic', 'Open-SEAtomic', 'New-SERegion', 'Open-SERegion', 'New-SECell', 'Open-SECell', 'New-SEVec', 'Open-SEVec', 'New-SESharedArc', 'Open-SESharedArc', 'New-SELazyValue', 'Open-SELazyValue', 'New-SEBitVec', 'Open-SEBitVec', 'New-SESpscRing', 'Open-SESpscRing', 'New-SEBroadcastRing', 'Open-SEBroadcastRing', 'New-SECapacityRing', 'Open-SECapacityRing', 'New-SELocaleRing', 'Open-SELocaleRing', 'New-SERing', 'Open-SERing', 'New-SEReorderWindow', 'New-SEStack', 'Open-SEStack', 'New-SEDeque', 'Open-SEDeque', 'New-SEPubSub', 'Open-SEPubSub', 'New-SELamportPair', 'New-SEFrameRegion', 'Open-SEFrameRegion', 'New-SEArena', 'Open-SEArena', 'New-SELinkedList', 'Open-SELinkedList', 'New-SESlab', 'Open-SESlab', 'New-SEBTreeMap', 'Open-SEBTreeMap', 'New-SEHashMap', 'Open-SEHashMap', 'New-SEMpscPool', 'New-SEMpmcGrid', 'New-SENotifierSet', 'New-SELeaderElection', 'Open-SELeaderElection', 'New-SEHolderTable', 'Open-SEHolderTable', 'New-SEHeartbeat', 'Open-SEHeartbeat', 'New-SEEpochBarrier', 'Open-SEEpochBarrier', 'New-SECondvar', 'Open-SECondvar', 'Wait-SECondition', 'New-SEFenceClock', 'Open-SEFenceClock', 'New-SEEpochs', 'Open-SEEpochs', 'New-SERWLock', 'Open-SERWLock', 'New-SESemaphore', 'Open-SESemaphore', 'New-SEOwnerLease', 'Open-SEOwnerLease', 'New-SEBloomFilter', 'Open-SEBloomFilter', 'Measure-SEBloomSize', 'New-SEBlockedBloomFilter', 'Open-SEBlockedBloomFilter', 'New-SEHyperLogLog', 'Open-SEHyperLogLog', 'New-SECountMinSketch', 'Open-SECountMinSketch', 'Measure-SESketchSize', 'New-SEHistogram', 'Open-SEHistogram', 'New-SERateLimiter', 'Open-SERateLimiter', 'New-SELruCache', 'Open-SELruCache', 'New-SEReservoir', 'Open-SEReservoir', 'New-SEHandleTable', 'Open-SEHandleTable', 'New-SETimePointTile', 'Open-SETimePointTile', 'New-SEVersionChain', 'Open-SEVersionChain', 'New-SEVersionedSlab', 'Open-SEVersionedSlab', 'New-SEVersionedMap', 'Open-SEVersionedMap', 'New-SELanedMap', 'Open-SELanedMap', 'New-SETopologyMap', 'Open-SETopologyMap', 'New-SEGraph', 'Open-SEGraph', 'New-SEUniversal', 'Open-SEUniversal', 'New-SETower', 'Open-SETower', 'New-SEChannel', 'Open-SEChannel', 'New-SEAdaptiveQueue', 'New-SEWorkQueue', 'Open-SEWorkQueue', 'New-SEKvMap', 'New-SEQosPolicy', 'New-SETinyBloom', 'New-SEFineBloom', 'New-SEClock', 'New-SECausalClock', 'New-SESensSender', 'New-SESensReceiver', 'New-SELossKind', 'New-SELossBursts', 'New-SETiming', 'New-SERoundTripShape', 'New-SEPeriodicity', 'New-SECapacity', 'New-SEForecast', 'New-SEPathChanges', 'New-SETcpBridgeClient', 'New-SETcpBridgeServer', 'New-SESelfSignedCert', 'New-SEQuicBridgeClient', 'New-SEQuicBridgeServer', 'Get-SETransport', 'Send-SEItem', 'Receive-SEItem', 'New-SEAdaptive', 'Get-SESidecar', 'Set-SESidecar', 'Invoke-SESidecarScan')
    PrivateData = @{ PSData = @{ Tags = @('pwrs', 'powershell', 'ipc', 'shared-memory', 'cross-process', 'cmdlet', 'bindings'); LicenseUri = 'https://github.com/Variably-Constant/SubEtha/blob/main/LICENSE-MIT'; ProjectUri = 'https://github.com/Variably-Constant/SubEtha'; IconUri = 'https://raw.githubusercontent.com/Variably-Constant/SubEtha/main/assets/icon.png'; ReleaseNotes = 'The module reaches the process''s sidecar: twenty-six structures and a new Adaptive object register with it through Observe(), a registration reads the InstanceStats the sidecar drains, and a ScriptBlock policy decides on the sidecar''s own thread which tag an object runs at. Get-SubEthaSidecar, Set-SubEthaSidecar and Invoke-SubEthaSidecarScan manage it, and the Ring, CapacityRing and LocaleRing cmdlets take -Managed and -ScanIntervalUs to run a ring''s own sidecar. The module imports in PowerShell 7.4 and later, where 0.5.1 needed 7.6, and in Windows PowerShell 5.1 as before. It is built with PoWerRuSt and cargo-pwrs 0.3.2, which compile its PowerShell 7 half against .NET 8 whichever machine builds it. It adds the shm: drive: $shm:name = value publishes a value every process of the user reads as $shm:name, live, outliving the session. 0.5.1 said the module works on FreeBSD x64, but that half referenced .NET 10 and did not import in FreeBSD''s PowerShell 7.5.5; this one does. In Windows PowerShell 5.1, where the first PWRS module a session imports serves every later one, import it before a module built by an older cargo-pwrs: after one built by 0.2.x through 0.3.1 it fails with pwrs_module_init status 4, and after one built by 0.1.8 or earlier with a type initializer error, as https://variably-constant.github.io/SubEtha/docs/how-to/powershell/troubleshoot/ describes. On Windows a lock, semaphore or condition wait sleeps in the kernel once its monitor budget runs out, where it held a processor for as long as it waited: an idle waiter is charged 0.000 to 0.003 of a core rather than 0.953 to 1.008, measured on Windows 11 / Ryzen 9 7900X. The waker behind those waits starts each wake scan and ends each park with a fence, which closes a lost wake shown on blocking rings, where a consumer slept beside an item until its timeout. A QUIC bridge client no longer writes a line of UDP counts to stderr each time it finishes, and no longer fails with a lost connection after the server has received every item: over 200 round trips on Linux x86-64, 4 failed that way in PowerShell 7.4.20 and 3 in 7.6.5 before, and none in either after. A LocaleRing from Open-SubEthaLocaleRing takes producer and consumer ids beside the handles already registered on the ring, where its RegisterProducer() or RegisterConsumer() panicked in the native library once another handle had registered. The module''s 227 Pester tests pass on Windows (PowerShell 7.6.6 and Windows PowerShell 5.1), Linux x64, macOS arm64 and FreeBSD x64.' } }
}