diff options
| author | user <user@clank> | 2026-07-17 01:11:11 +0200 |
|---|---|---|
| committer | user <user@clank> | 2026-07-17 01:11:11 +0200 |
| commit | 41dd342751541ab843262c13420e08db1a0035b0 (patch) | |
| tree | b06d974c75ced81babf07f552e8a3a3aa4658872 /Makefile | |
| parent | kernel+sh: real anonymous pipes (concurrent, streaming, SIGPIPE) (diff) | |
| download | gbos-41dd342751541ab843262c13420e08db1a0035b0.tar.gz gbos-41dd342751541ab843262c13420e08db1a0035b0.tar.xz gbos-41dd342751541ab843262c13420e08db1a0035b0.zip | |
pipe: PIPE_MAX 2->4 (5-stage pipelines) + fix cross-yield byte corruption
Bump PIPE_MAX to 4 so a|b|c|d|e (4 pipes) works. This stays within the
single-byte buffer-offset math (idx*64+pos <= 3*64+63 = 255) and the fd
space ($F0..$F7, clear of $FF console).
The bump exposed a data-corruption bug that also affected the 2-pipe case
(just invisibly - a wc-only test can't see mangled bytes): pipe_write kept
the byte-to-write in the SHARED wPipeByte global across its SchedYield
(buffer full), so a concurrent pipe op clobbered it and the writer then
stored the wrong byte. Now the byte is held in D across the yield, and
pipe_bufptr no longer clobbers D; pipe_read/pipe_write also push their idx
across SchedYield rather than assume the yield preserves registers.
Verified: count N | cat now streams EXACT content (no 'linn'/'llne'
corruption); count 60 | cat | cat | wc = 60 180 1671; 5-stage
count 4 | cat | cat | cat | cat prints line 1..4; SIGPIPE (count 200|true)
and count 100|wc still fine, no hangs.
Diffstat (limited to 'Makefile')
0 files changed, 0 insertions, 0 deletions
