Align relibc IPC overlay docs

This commit is contained in:
2026-04-19 09:26:57 +01:00
parent cd4961f4b6
commit ec07831732
2 changed files with 93 additions and 54 deletions
@@ -8,7 +8,7 @@ gaps**, and **overall quality**, then defines a practical plan for improving it.
The goal is not to treat relibc as a generic libc project. The goal is to describe:
- what is already strong,
- what exists only through local patch carriers,
- what still depends on active local overlay state rather than upstream relibc itself,
- what is still incomplete or weak,
- what downstream subsystems still depend on relibc improvement,
- and what order of work best improves real system capability.
@@ -21,7 +21,7 @@ pre-correction roadmap assumptions.
This plan uses four evidence buckets and does **not** treat them as equivalent:
- **source-visible** — behavior visible directly in the current relibc source tree
- **patch-carried** — behavior carried in `local/patches/relibc/P3-*.patch`
- **patch-carried** — behavior carried in the active `local/patches/relibc/*.patch` recipe inputs rather than upstream relibc itself
- **build-visible downstream** — downstream packages now compile because the libc surface exists
- **runtime-validated** — behavior has been exercised successfully in real downstream/runtime paths
@@ -34,17 +34,24 @@ For relibc, the ownership boundary must stay explicit:
- `recipes/core/relibc/source/` is the live upstream-owned working tree used for actual build and
validation
- `local/patches/relibc/P3-*.patch` is the Red Bear-owned durable carrier for relibc changes
- the active Red Bear-owned durable relibc compatibility carrier is the recipe-replayed
`local/patches/relibc/*.patch` set; in the current tree that active replay has narrowed to
`local/patches/relibc/redox.patch`
- older `local/patches/relibc/P3-*.patch` files are historical bring-up references unless a current
recipe still replays them
- `local/docs/...` is the durable explanation of what those changes mean and how to reapply them
That means a relibc change is not truly preserved until it exists in **both** places:
That means a relibc change is not truly preserved until its ownership is explicit in the right
place:
1. the live relibc source tree, so the current build can prove it
2. the `local/patches/relibc/` carrier set, so the same result can be recreated after an upstream refresh
1. if upstream now owns the behavior, the live relibc source tree is the canonical implementation
2. if Red Bear still owns a unique delta, it must also exist in the active
`local/patches/relibc/` recipe input set so the same result can be recreated after an upstream
refresh
The repo standard for success is not merely “the current source tree builds.” The standard is:
> we can fetch fresh upstream relibc sources, reapply the Red Bear relibc patch carriers, and still
> we can fetch fresh upstream relibc sources, reapply the active Red Bear relibc patch carriers, and still
> rebuild the same working result.
Any relibc work that exists only under `recipes/core/relibc/source/` should therefore be treated as
@@ -62,7 +69,7 @@ The goal is durable compatibility, not a permanent relibc fork.
> **Implementation note (current Red Bear tree):** this repo pass moved several relibc items from
> patch-carried-only or downstream-workaround status into source-visible libc behavior. The current
> tree now contains source-visible `signalfd`, `timerfd`, `eventfd`, `open_memstream`,
> tree now contains source-visible and strict Redox-target runtime-tested `signalfd`, `timerfd`, `eventfd`, `open_memstream`,
> `F_DUPFD_CLOEXEC`, `MSG_NOSIGNAL`, a bounded `waitid()` path, bounded `RLIMIT_NOFILE` /
> `RLIMIT_MEMLOCK` behavior, a bounded `eth0`-backed `net/if.h` / `ifaddrs.h` view, a source-visible
> `resolv.h` plus bounded `res_query()` / `res_search()` compatibility paths with receive/send
@@ -96,11 +103,13 @@ The goal is durable compatibility, not a permanent relibc fork.
> succeed in the current tree.
>
> **Additional focused coverage (current Red Bear tree):** integrated relibc tests were also added
> for `open_memstream`, SysV semaphores via `semget`/`semop`/`semctl`, `timerfd`, and `signalfd`.
> On the host-side relibc sysroot, `open_memstream` and `semget` execute successfully, while the
> `timerfd` and `signalfd` tests currently report bounded unavailability in that host environment
> rather than hanging or crashing. That still falls short of Redox runtime proof for those two
> non-POSIX APIs, but it moves them from source-visible-only status into the explicit test harness.
> for `open_memstream`, SysV semaphores via `semget`/`semop`/`semctl`, `timerfd`, `signalfd`, and
> `eventfd`. On the host-side relibc sysroot, `open_memstream`, `semget`, and the bounded SysV shm
> path execute successfully. On the Redox-target runtime path, the repaired `cookbook_redoxer`
> `write-exec` flow now executes the targeted `eventfd`, `signalfd`, and `timerfd` binaries
> successfully against the staged relibc test tree, and those tests now fail hard if the APIs are
> unavailable. That moves the fd-event APIs from source-visible/build-visible status into explicit
> runtime-tested status for the bounded relibc harness.
>
> **Fresh-upstream reapply proof (current Red Bear tree):** a fresh `repo unfetch relibc` →
> `repo fetch relibc` cycle was used to reconstruct the relibc source tree from upstream-owned
@@ -146,13 +155,13 @@ The current repo also shows relibc is still weak in:
| Area | State | Notes |
|---|---|---|
| Core POSIX/header breadth | **strong / partial** | Large header surface exists, but many TODO headers and feature gaps remain |
| Wayland-facing P3 APIs | **implemented / source-visible / runtime-unproven** | `signalfd`, `timerfd`, `eventfd`, `open_memstream`, socket flags, and `F_DUPFD_CLOEXEC` now exist in the relibc source tree; runtime proof still trails build integration |
| Wayland-facing P3 APIs | **implemented / runtime-tested / bounded** | `signalfd`, `timerfd`, `eventfd`, `open_memstream`, socket flags, and `F_DUPFD_CLOEXEC` now exist in the relibc source tree; strict targeted relibc runtime tests now execute on Redox, but broader consumer semantics still need careful documentation |
| Networking/libc socket surface | **usable / partial** | AF_INET/AF_UNIX paths exist, but interface/reporting/resolver behavior remains narrow |
| Qt/KDE downstream unblockers | **build-side improved / multiple gates crossed** | `QProcess`, `QSharedMemory`, and `QSystemSemaphore` now configure, build, and stage on in-tree qtbase; broader runtime validation is still needed |
| Shared memory / semaphore completeness | **partial** | `shm_open` exists through the Redox shm path, but SysV IPC/shared-memory and named semaphore completeness remain open |
| Process/runtime completeness | **partial** | Some process-facing functionality still uses stubs or downstream workarounds |
| Dedicated test surface | **present / Redox-specific coverage still thin** | relibc has a substantial `source/tests/` tree, but the Red Bear-visible Redox/P3/runtime validation story is still weaker than the generic libc test surface |
| Runtime validation against real consumers | **insufficient** | Still weaker than build-side evidence |
| Runtime validation against real consumers | **improved / still bounded** | relibc fd-event runtime tests now execute on Redox; broader desktop consumer semantics still need continued confirmation |
## Strong Points
@@ -168,20 +177,33 @@ greenfield libc effort.
### 2. The historical P3 Wayland-facing API bridge is now source-visible
The local relibc patch carriers documented the APIs that historically blocked Wayland and downstream
consumers. In the current preserved tree, the overlapping Wayland/Qt-facing registration and API work
for `signalfd`, `timerfd`, `eventfd`, `waitid`, `open_memstream`, socket flags, bounded
`ifaddrs`/`net_if`, and the bounded resolver headers now lives in the tracked
`local/patches/relibc/redox.patch` carrier so the recipe does not depend on a fragile stack of
overlapping standalone patch files.
consumers. In the current preserved tree, those fd-event and adjacent IPC surfaces are now present
in the active upstream relibc source itself, and the relibc-facing recipes no longer replay the old
standalone P3 carrier set for `eventfd`, `signalfd`, `timerfd`, `waitid`, SysV IPC, or their focused
test files. The active Red Bear relibc recipe replay has narrowed back to the shared
`local/patches/relibc/redox.patch` compatibility delta, while the historical P3 patch files remain
useful as prior bring-up evidence rather than current recipe inputs.
The remaining Red Bear-owned relibc carriers currently add or complete:
### 3. Focused fd-event proof record
- `signalfd` / `signalfd4`
- `timerfd_create` / `timerfd_settime` / `timerfd_gettime`
- `eventfd` / `eventfd_read` / `eventfd_write`
- bounded `waitid()`
- bounded `sys/ipc.h`, `sys/sem.h`, and `sys/shm.h` compatibility layers
- focused relibc IPC tests needed to keep those overlays validated after upstream refresh
The bounded fd-event runtime proof now has a small tracked record here so it does not depend only on
session history.
Preserved command shape:
- rebuild relibc from tracked carriers: `repo unfetch relibc && repo fetch relibc && repo cook relibc`
- rebuild targeted test package: `TESTBIN=sys_eventfd/eventfd CI=1 ./target/release/repo cook relibc-tests-bins`
- execute inside staged Redox target via `cookbook_redbear_redoxer write-exec`
Recorded bounded runtime markers from the current pass:
- `eventfd_runtime_finalfinal_ok`
- `signalfd_runtime_finalfinal_ok`
- `timerfd_runtime_finalfinal_ok`
- `eventfd_runtime_kernelreplay_ok`
These markers should be read as proof of the bounded relibc fd-event harness only. They do not by
themselves claim full Linux-equivalent semantics for every downstream desktop consumer.
The upstream-first policy still applies here, but the durable patch-carrier set should be trimmed
only when a fresh upstream refetch plus reapply plus downstream rebuild actually proves the upstream
@@ -199,8 +221,8 @@ not yet solve, but they should be retired as soon as upstream makes them redunda
The current docs consistently show that relibc has already enabled substantial downstream progress:
- `docs/02-GAP-ANALYSIS.md` now marks the P3 bridge as implemented in-tree, with runtime validation still pending
- `docs/03-WAYLAND-ON-REDOX.md` says the build-side relibc/libwayland bridge is restored and that the remaining blocker is runtime validation, not basic POSIX availability
- `docs/02-GAP-ANALYSIS.md` now marks the P3 bridge as implemented in-tree with strict Redox-target runtime proof for the fd-event slice
- `local/docs/WAYLAND-IMPLEMENTATION-PLAN.md` says the build-side relibc/libwayland bridge is restored and that the remaining blocker is runtime validation, not basic POSIX availability
- `local/docs/QT6-PORT-STATUS.md` treats many earlier relibc blockers as moved from “missing” to “present but still needs downstream validation”
This is a major quality signal: relibc is already strong enough to unlock real build-side subsystem work.
@@ -378,8 +400,8 @@ The old “basic POSIX APIs are missing” story is no longer the main one.
Current state:
- `signalfd`, `timerfd`, `eventfd`, `open_memstream`, and key socket flags are now source-visible in relibc and still tracked by patch carriers for sync/upstream purposes
- the current bounded `waitid()` path is also preserved as a relibc patch carrier so it can be reapplied after upstream refresh
- `signalfd`, `timerfd`, `eventfd`, `open_memstream`, bounded `waitid()`, key socket flags, and the adjacent SysV IPC surfaces are now source-visible in the active relibc tree without needing the old standalone P3 replay set
- the active Red Bear relibc replay has narrowed to the shared `redox.patch` compatibility delta while those older P3 files remain historical references
- `libwayland` now rebuilds with a much smaller Redox patch
Remaining blocker:
@@ -390,8 +412,10 @@ So the current relibc task for Wayland is primarily **runtime proof and patch re
adding obvious libc symbols.
Current Red Bear evidence is stronger than before: `libwayland` now cooks successfully against the
updated relibc tree, which means the generated `sys/signalfd.h`, `sys/timerfd.h`, `sys/eventfd.h`,
and `stdio.h`/`sys/socket.h` surfaces are now sufficient for at least one major downstream consumer.
rebuilt relibc image produced from the current upstream-backed relibc tree plus the active shared
Red Bear compatibility delta, which means the `signalfd`, `timerfd`, `eventfd`, `stdio.h`, and
`sys/socket.h` surfaces are sufficient for at least one major downstream consumer in the current
rebuild model.
### Qt / KDE
@@ -76,7 +76,7 @@ Current manual verification in this repo pass:
- `cargo check --target x86_64-unknown-linux-gnu` passes for relibc
- host-side focused IPC tests execute successfully for `open_memstream` and `semget`
- host-side focused `timerfd` and `signalfd` tests report bounded unavailability rather than hanging
- targeted Redox runtime execution now validates the `timerfd` and `signalfd` tests directly through the repaired `write-exec` path instead of relying on bounded host-side fallback behavior
- `CI=1 ./target/release/repo cook relibc` completes successfully after clearing a stale stage-dir collision
- `CI=1 ./target/release/repo cook qtbase` now succeeds after exporting `eventfd_t` and restoring a bounded `waitid()` path
- a fresh `repo unfetch relibc``repo fetch relibc` cycle plus reapplication of
@@ -135,10 +135,10 @@ kernel IPC model under the hood, but it still exposes familiar libc entry points
schemes.
The second strong point is that the IPC work is not just source-visible anymore. The focused relibc
tests already cover `sem_open`, `shmget`, `open_memstream`, `semget`, `eventfd`, and the bounded
host-side `timerfd` / `signalfd` cases. The broader relibc plan also records successful downstream
builds for `libwayland`, `qtbase`, and `openssh`, which means real consumers are already benefiting
from this work, but those consumers do **not** all prove IPC depth equally.
tests already cover `sem_open`, `shmget`, `open_memstream`, `semget`, `eventfd`, and the targeted
Redox-runtime `timerfd` / `signalfd` cases. The broader relibc plan also records successful
downstream builds for `libwayland`, `qtbase`, and `openssh`, which means real consumers are already
benefiting from this work, but those consumers do **not** all prove IPC depth equally.
### 2. Weak spots
@@ -161,13 +161,24 @@ Named POSIX semaphores are also present but still bounded. `sem_open()` is imple
`shm_open()`, which is a practical Redox-native strategy, but the current code comments already mark
it as a bounded Redox path rather than a full Linux/glibc-equivalent semantic model.
The descriptor-event primitives are in a similar state. `eventfd` is in comparatively good shape,
including a host fallback for Linux test execution. `signalfd` and `timerfd` are weaker. The host
tests for both currently report bounded unavailability instead of successful execution, which is
better than a hang or crash but still leaves them short of runtime trust. `timerfd` in particular
supports only `TFD_CLOEXEC`, `TFD_NONBLOCK`, and `TFD_TIMER_ABSTIME`; Linux-style
`TFD_TIMER_CANCEL_ON_SET` semantics are still absent, and downstream KWin code explicitly wants
that flag.
The descriptor-event primitives are in a materially better state than before. `eventfd` now has a
real counter-style runtime path instead of only a source-visible wrapper, and the targeted Redox
runtime test harness now executes strict `eventfd`, `signalfd`, and `timerfd` test binaries
successfully through the repaired `write-exec` runner path. The older "unavailable is success"
fallbacks were removed from those focused tests, so these are now actual runtime checks rather than
mere launch proofs.
The preserved overlay story for those paths is now simpler than it was during the original bounded
bring-up. The current relibc tree already contains the fd-event implementations and focused tests
upstream, so the active Red Bear recipe replay no longer needs the old standalone
`P3-eventfd.patch`, `P3-signalfd.patch`, `P3-signalfd-header.patch`, `P3-timerfd.patch`, and
`P3-fd-event-tests.patch` carriers. In the current repo, `redox.patch` remains the active shared
Red Bear relibc delta, while the historical P3 files are legacy references rather than recipe inputs.
The remaining caution is semantic breadth, not whether the paths execute at all. `timerfd` is now
runtime-validated for the bounded relibc test harness, but downstream consumers such as KWin still
pressure Linux-oriented details like `TFD_TIMER_CANCEL_ON_SET`, so broad desktop/runtime trust
should still be described as narrower than full Linux equivalence.
### 3. Missing areas
@@ -259,8 +270,9 @@ Current test story:
- host-side focused execution exists for `sem_open`, `shmget`, `open_memstream`, `semget`, and
`eventfd`
- `signalfd` and `timerfd` are in the test harness, but host execution currently reports bounded
unavailability
- targeted Redox runtime execution now exists for `signalfd`, `timerfd`, and `eventfd` via
`relibc-tests-bins` and the repaired `cookbook_redoxer write-exec` path, with strict pass/fail
semantics rather than availability fallbacks
- downstream build evidence exists for `libwayland`, `qtbase`, and `openssh`
What is still missing is stronger Redox-target or consumer-runtime proof for Qt/KDE and Wayland
@@ -270,18 +282,21 @@ live session.
The strongest safe claim today is therefore:
- **source-visible** across the major IPC surfaces,
- **test-visible** for focused host-side cases,
- **test-visible** for focused host-side and Redox-target fd-event cases,
- **build-visible downstream** for meaningful consumers,
- but **not yet broadly runtime-trusted on Redox**.
- with **bounded runtime trust on Redox for the relibc fd-event harness**,
- but **not yet broad proof of full Linux-equivalent semantics for every desktop consumer path**.
### Blocker 3 — Descriptor-event semantics are still narrower than Linux-oriented callers expect
KWins timer code wants `TFD_TIMER_CANCEL_ON_SET`. The current relibc timerfd layer does not support
that flag. This is a concrete example of a downstream expectation gap that is not solved by simply
having `timerfd_create()` present.
KWins timer code wants `TFD_TIMER_CANCEL_ON_SET`. The current bounded relibc timerfd layer does
not claim that full Linux cancel-on-clock-change semantic. The preserved test/runtime slice proves
one-shot behavior and successful `TFD_TIMER_ABSTIME` / bounded flag-surface handling, while broader
Linux-equivalent cancel-on-clock-change semantics remain an explicit downstream expectation gap.
Likewise, `signalfd` support is visible and exported, but its current confidence story is still too
thin for broad claims about desktop/runtime readiness.
Likewise, `signalfd` support is no longer merely visible/exported; it now passes the targeted
Redox-runtime relibc test path. The remaining question is broader consumer semantics and long-tail
desktop/runtime confidence, not basic availability.
### Blocker 4 — Message queues remain a completely open IPC front