Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,24 @@
# Changelog

## 4.10.17 — Supervised services with a non-blocking client

- New light top-level Python package `running_process_service`
(`ServiceSpec`, `ServiceServer`, `serve`, `ServiceClient`) and Rust
`broker::backend_sdk::{ServiceServer, PollingFrameClient}`: a small
service bound once per user (`ServiceAlreadyRunning` for a second
instance), health-probed through its identity file, and respawned by its
clients under a lock file within a spawn budget (3 per 30 s), with no
broker. See `docs/SERVICE.md`.
- The client never blocks: `send` fails fast with `ServiceUnavailable` or
`QueueFull`, `try_recv` polls, and replies are matched by request id
(out of order). Built for callers that may only poll from a timer, such
as code on a terminal emulator's UI thread.
- `import running_process_service` loads only the native extension, not the
`running_process` package.
- `ipc::Stream::set_interruptible_reads` / `bytes_available` (platform
facade): reads that a closing server can interrupt on every platform;
Windows pipes poll `PeekNamedPipe` because they ignore receive timeouts.

## 4.10.16 — Actually Portable Executable launches

- Runs Cosmopolitan Actually Portable Executables (APE) on hosts with no
Expand Down
22 changes: 11 additions & 11 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ members = [
exclude = ["testbins-tokio"]

[workspace.package]
version = "4.10.16"
version = "4.10.17"
edition = "2021"
rust-version = "1.95"
license = "MIT"
Expand Down
2 changes: 1 addition & 1 deletion crates/running-process-platform-internal/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ conpty-sidecar = [
[dependencies]
miniz_oxide = { version = "0.8", optional = true }
prost = { version = "0.14", optional = true }
running-process-protocol = { version = "=4.10.16", path = "../running-process-protocol", optional = true }
running-process-protocol = { version = "=4.10.17", path = "../running-process-protocol", optional = true }
tokio = { version = "1", default-features = false, features = ["io-util", "macros", "process", "rt"], optional = true }
sysinfo = { version = "0.30", optional = true }
interprocess = { version = "2", optional = true }
Expand Down
6 changes: 3 additions & 3 deletions crates/running-process-probe-daemon/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,15 @@ path = "src/bin/rpprobe.rs"
# Broker primitives reused as libraries: framing codec, peer-cred/owner-only
# ACL, privilege refusal, SID hashing, private-dir hardening. The probe daemon
# is NOT a broker backend — it borrows the plumbing, not the wire.
running-process = { path = "../running-process", version = "4.10.16", default-features = false, features = [
running-process = { path = "../running-process", version = "4.10.17", default-features = false, features = [
"client",
] }
# probe_diag.v1 schema (S1 / #630).
running-process-probe = { path = "../running-process-probe", version = "4.10.16" }
running-process-probe = { path = "../running-process-probe", version = "4.10.17" }
# Host endpoint naming, runtime directory, private/no-follow file opens and
# fault-code names (#974). `running-process` already depends on this crate, so
# this adds no new package to the graph; only `ipc` and `fs` are enabled.
running-process-platform-internal = { path = "../running-process-platform-internal", version = "4.10.16", default-features = false, features = ["ipc", "fs"] }
running-process-platform-internal = { path = "../running-process-platform-internal", version = "4.10.17", default-features = false, features = ["ipc", "fs"] }

interprocess = "2"
prost = "0.14"
Expand Down
2 changes: 1 addition & 1 deletion crates/running-process-probe/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ object = { version = "0.36", default-features = false, features = ["read", "std"
# #974: which images are loaded is host mechanics and comes from the platform
# facade. Only the dependency-free core is enabled; the object parsers above
# stay here, never in the facade.
running-process-platform-internal = { path = "../running-process-platform-internal", version = "4.10.16", default-features = false }
running-process-platform-internal = { path = "../running-process-platform-internal", version = "4.10.17", default-features = false }

[target.'cfg(any(target_os = "linux", target_os = "macos"))'.dependencies]
# #635 cooperative capture uses realtime signals/ucontext on Linux and Mach
Expand Down
6 changes: 3 additions & 3 deletions crates/running-process-py/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,15 @@ crate-type = ["cdylib", "lib"]
libc = "0.2"
pyo3 = { workspace = true }
regex = "1"
running-process = { path = "../running-process", version = "4.10.16", features = ["async-process", "client", "originator-scan", "probe", "pty"] }
running-process = { path = "../running-process", version = "4.10.17", features = ["async-process", "client", "originator-scan", "probe", "pty"] }
pyo3-async-runtimes = { version = "0.29", features = ["tokio-runtime"] }
tokio = { version = "1", default-features = false, features = ["sync"] }
sysinfo = "0.30"
prost = "0.14"
# Supplies the probe_diag.v1 prost enums and the all-thread snapshot API.
# default-features = false keeps the crate's injection vehicles (gated on its
# embed-helper feature) out of the extension module entirely.
running-process-probe = { path = "../running-process-probe", version = "4.10.16", default-features = false }
running-process-probe = { path = "../running-process-probe", version = "4.10.17", default-features = false }
# #975: the tracked-pid registry asks the platform facade for the state base
# directory instead of selecting the host itself.
running-process-platform-internal = { path = "../running-process-platform-internal", version = "4.10.16", features = ["fs"] }
running-process-platform-internal = { path = "../running-process-platform-internal", version = "4.10.17", features = ["fs"] }
8 changes: 4 additions & 4 deletions crates/running-process/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "running-process"
version = "4.10.16"
version = "4.10.17"
edition = "2021"
rust-version = "1.95"
license = "MIT"
Expand Down Expand Up @@ -275,14 +275,14 @@ sha2 = { version = "0.10", optional = true }
getrandom = { version = "0.4", optional = true }
# #633: schema-only dependency for the probe client facade. default-features
# off keeps the interposer/injection machinery out — see the `probe` feature.
running-process-probe = { path = "../running-process-probe", version = "4.10.16", default-features = false, optional = true }
running-process-protocol = { path = "../running-process-protocol", version = "4.10.16", optional = true }
running-process-probe = { path = "../running-process-probe", version = "4.10.17", default-features = false, optional = true }
running-process-protocol = { path = "../running-process-protocol", version = "4.10.17", optional = true }
# Preserve the long-standing `process_tree::kill_tree` path for 4.x
# `default-features = false` consumers. The current Phase 0.5 containment
# primitive is sysinfo-backed, so the root selects this narrow private
# platform capability unconditionally while keeping public inspection APIs
# behind `process-inspection`. Other platform capabilities stay opt-in.
running-process-platform-internal = { path = "../running-process-platform-internal", version = "4.10.16", default-features = false, features = ["process-inspection"] }
running-process-platform-internal = { path = "../running-process-platform-internal", version = "4.10.17", default-features = false, features = ["process-inspection"] }
# Wave 5 of #165: daemon-feature deps. All optional except tokio.
# tokio (#850): unconditional since NativeProcess's lifecycle observer runs
# on the process-global actor runtime. The base set is deliberately minimal
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "soldr"

[project]
name = "running_process"
version = "4.10.16"
version = "4.10.17"
description = "A Rust-backed subprocess wrapper with split stdout/stderr streaming"
readme = "README.md"
requires-python = ">=3.10"
Expand Down
2 changes: 1 addition & 1 deletion src/running_process/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from __future__ import annotations

__version__ = "4.10.16"
__version__ = "4.10.17"

# Imported first: turns a free-threaded interpreter loading the GIL-runtime
# extension into an ImportError instead of a segfault (#1142).
Expand Down
4 changes: 2 additions & 2 deletions uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading