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). --- include/gbos.inc | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'include') diff --git a/include/gbos.inc b/include/gbos.inc index 9b44b33..aca92e3 100644 --- a/include/gbos.inc +++ b/include/gbos.inc @@ -125,7 +125,8 @@ DEF SYS_BPEEK EQU 24 ; [debug] read a disk block (B=block, E=off -> A) DEF SYS_MKDIR EQU 25 ; make a directory (DE=path -> A=0/$FF) DEF SYS_CHDIR EQU 26 ; change directory (DE=path -> A=0/$FF) DEF SYS_OPENDIR EQU 27 ; point ls at a directory (DE=path -> A=0/$FF) -DEF SYS_MAX EQU 28 +DEF SYS_PIPE EQU 28 ; make a pipe (-> A=read fd; write=A+1) +DEF SYS_MAX EQU 29 ; SYS_KILL (9) is now implemented (B=pid -> A=0/$FF; pid 1 is immortal) ; (SYS_OPEN=4 / SYS_CLOSE=5 are now implemented by the filesystem) @@ -179,6 +180,11 @@ DEF OF_MODE EQU 2 DEF OF_POS EQU 3 DEF OF_SIZE EQU 5 +; anonymous pipes +DEF PIPE_MAX EQU 2 ; concurrent pipes +DEF PIPE_BUFSZ EQU 64 ; ring buffer bytes per pipe +DEF PIPE_FD_BASE EQU $F0 ; pipe fds: $F0+idx*2 (read), +1 (write); $FF=console + ; ----------------------------------------------------------------------------- ; Program table indices (see programs.asm). exec() takes one of these in B. ; ----------------------------------------------------------------------------- @@ -204,5 +210,6 @@ DEF PROG_SPIN EQU 18 DEF PROG_BLK EQU 19 DEF PROG_MKDIR EQU 20 DEF PROG_COUNT EQU 21 +DEF PROG_PTEST EQU 22 ENDC -- cgit v1.3.1-sl0p