From 73295e7acc1e5ec3ee8814fd4ccc45f7cee63392 Mon Sep 17 00:00:00 2001 From: user Date: Fri, 17 Jul 2026 01:04:16 +0200 Subject: kernel+sh: real anonymous pipes (concurrent, streaming, SIGPIPE) Replace the shell's temp-file pipe hack with proper in-kernel FIFOs. Kernel (src/pipe.asm, new): - A small pool of bounded ring buffers (PIPE_MAX=2, 64 B each) with writers/readers refcounts. Pipe fds are $F0+idx*2 (read) / +1 (write); $FF stays "console". - SYS_PIPE allocates one (writers=readers=1) and returns the read fd (write = read+1). getb/putb/close dispatch pipe fds here; sys_exit drops the refcounts held as PROC_STDIN/PROC_STDOUT. - Blocking with SchedYield, which is the flow control: read blocks while empty with a writer (EOF once writers hit 0), write blocks while full with a reader, and if the last reader is gone the writer is killed (SIGPIPE -> exit 141). Cooperative-scheduler friendly. Shell (c/sh.c): - run_pipeline(): split on '|', make a pipe between adjacent stages, and fork ALL stages concurrently (no wait between), wiring stdin/stdout; then wait for all. Per-stage >/< still honored; orphaned pipe ends are closed on a lookup miss so EOF/EPIPE propagate. - Drop the __pipe temp file and its 2 KB / serialized limits. libc: pipe(). New c/ptest.c exercises the FIFO (write, read back, EOF). Now works (old version couldn't): multi-stage a|b|c; streaming beyond 2 KB (count 120 | wc = 3372 bytes through a 64 B buffer); early-exit SIGPIPE (count 200 | true kills count instead of hanging/overflowing a file). --- src/fs.asm | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'src/fs.asm') diff --git a/src/fs.asm b/src/fs.asm index a4ad77e..1c6d299 100644 --- a/src/fs.asm +++ b/src/fs.asm @@ -760,6 +760,13 @@ sys_open:: ; sys_close(B = fd) - flush data + inode, free the descriptor ; ============================================================================= sys_close:: + ld a, b + call is_pipe_fd + jr c, .notpipe + call pipe_close + xor a + ret +.notpipe ld a, b cp OF_MAX jr nc, .done @@ -786,6 +793,9 @@ sys_close:: ; sys_getb(B = fd) -> A = byte, CF set on EOF ; ============================================================================= sys_getb:: + ld a, b + call is_pipe_fd + jp nc, pipe_read ; A = pipe read fd ld a, b cp OF_MAX jr nc, .eof @@ -868,6 +878,10 @@ sys_getb:: sys_putb:: ld a, e ld [wFsByte], a + ld [wPipeByte], a + ld a, b + call is_pipe_fd + jp nc, pipe_write ; A = pipe write fd, byte in wPipeByte ld a, b cp OF_MAX jr nc, .done -- cgit v1.3.1-sl0p