summaryrefslogtreecommitdiff
path: root/src/gui
diff options
context:
space:
mode:
authorGabriel Schneider <[email protected]>2026-08-27 15:28:21 -0300
committerGabriel Schneider <[email protected]>2026-08-27 15:32:02 -0300
commit0a21ea831d6791b406eef70b3e95cfd319d8ed36 (patch)
treecd92d6c745ac6aa19e8933f5bee17db6854b6dab /src/gui
parente9897bd9566832dfa09f4d3cf5daa6f3d0a84bd5 (diff)
downloadpardes-0a21ea831d6791b406eef70b3e95cfd319d8ed36.tar.gz
pardes-0a21ea831d6791b406eef70b3e95cfd319d8ed36.zip
fs_service: the transport is a ctx and three functions, not a *fuse.Fs
Step 2 of the 9P chain (docs/9p.typ 12.2, docs/registry.typ 9P-2). `drain` and `step` never asked a `*fuse.Fs` for anything but `retry()`, `next()` and `reply()`, so the concrete pointer was a coupling that bought nothing and forbade a second answer. `Transport` names the three; `Fs.transport()` is the first implementor and the thunks are the entire cost. No behaviour change. The order contract -- retry() to null, then next() to null -- moves into `drain`'s doc comment, where it belongs: it is the caller's rule and every implementor inherits it, rather than a fact about FUSE. `start` and `wake` keep their `*fuse.Fs`: they are about a MOUNT, which is a FUSE thing, and a 9P listener will bring its own. Measured unchanged against zig build fs-bench -Doptimize=ReleaseFast: getattr 19 ns, lookup 40, read body 4K/1M 25/25, read ctl 385, read index 633, readdir 38, read event (empty) 22, all at zero allocations.
Diffstat (limited to 'src/gui')
-rw-r--r--src/gui/gui.zig4
1 files changed, 2 insertions, 2 deletions
diff --git a/src/gui/gui.zig b/src/gui/gui.zig
index c42e390b..da48d3fb 100644
--- a/src/gui/gui.zig
+++ b/src/gui/gui.zig
@@ -3735,7 +3735,7 @@ fn pollFrame(ctx: ?*anyopaque) void {
// poll thread, so nothing else will wake us — re-arm the loop ourselves;
// `Queue.push` is lossy for this variant, which is correct, because a queue
// too full to take a wake is already holding one.
- if (s.fs) |f| if (fs_service.drain(f, core).pending) s.queue.push(.fs_ready);
+ if (s.fs) |f| if (fs_service.drain(f.transport(), core).pending) s.queue.push(.fs_ready);
const g = s.gui orelse return;
// TaglineSize is pure renderer state: update the smaller face and its
// visual band immediately, without changing the body metrics or grid.
@@ -3838,7 +3838,7 @@ fn gridPollFrame(ctx: ?*anyopaque) void {
// something IS an event, so the pass renders: that is what lets a snapshot
// `wait` for text a script wrote through the mount.
if (s.fs) |f| {
- if (fs_service.drain(f, s.core).count != 0) s.saw_event = true;
+ if (fs_service.drain(f.transport(), s.core).count != 0) s.saw_event = true;
}
pollCwds(s.core, s.ptys);
// The harness polls stdin at the same 16 ms cadence as native SDL, so a