aboutsummaryrefslogtreecommitdiffstats
path: root/c/libc.s
diff options
context:
space:
mode:
authoruser <user@clank>2026-07-17 01:04:16 +0200
committeruser <user@clank>2026-07-17 01:04:16 +0200
commit73295e7acc1e5ec3ee8814fd4ccc45f7cee63392 (patch)
tree88f66fb3db17e8ee755b2d2a408ce232292f9248 /c/libc.s
parentterm: compute the OSK view offset from the cursor row (keep input visible) (diff)
downloadgbos-73295e7acc1e5ec3ee8814fd4ccc45f7cee63392.tar.gz
gbos-73295e7acc1e5ec3ee8814fd4ccc45f7cee63392.tar.xz
gbos-73295e7acc1e5ec3ee8814fd4ccc45f7cee63392.zip
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).
Diffstat (limited to '')
-rw-r--r--c/libc.s8
1 files changed, 7 insertions, 1 deletions
diff --git a/c/libc.s b/c/libc.s
index d499521..ec59bb7 100644
--- a/c/libc.s
+++ b/c/libc.s
@@ -1,6 +1,6 @@
.module libc
.globl _writes, _putc, _puts, _nl, _strlen, _readc, _sexit, _getpid, _getargs
- .globl _open, _close, _fgetc, _fputc, _flist, _fremove
+ .globl _open, _close, _fgetc, _fputc, _flist, _fremove, _pipe
;; SDCC sm83 sdcccall(1): 1st arg -> A (byte) or DE (pointer); ret A / BC.
;; rst $30 (the trap) clobbers BC/DE/HL; SDCC treats them caller-saved, so
;; wrappers need not preserve them - but we compute cleanly regardless.
@@ -86,6 +86,12 @@ _getpid:
rst #0x30
ret
+ ;; unsigned char pipe(void) -> A (read fd; write end is read+1)
+_pipe:
+ ld c, #28 ; SYS_PIPE
+ rst #0x30
+ ret
+
;; unsigned char open(const char *name /*DE*/, unsigned char mode /*A*/) -> A(fd)
_open:
ld b, a ; B = mode