From bb4f468b73c8a888bec1e5b2ba7f1575ab7f8456 Mon Sep 17 00:00:00 2001 From: user Date: Thu, 16 Jul 2026 11:15:12 +0200 Subject: jobs: background execution (&), non-blocking reap, spin demo - sys_reap: nohang reap of a finished zombie child (-> pid or 0). - shell: 'cmd &' launches in the background (prints [pid], no wait); reaps finished jobs at the prompt ([pid done]). Foreground now waits for its own child specifically (loops wait(), reporting bg completions meanwhile) so kill reports the right pid. - spin: a process that yields forever - a target for ps/kill. - verified: spin &; ps shows it; kill removes just that one; immortal init; self-finishing bg worker reaped with [pid done]. --- src/syscall.asm | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) (limited to 'src/syscall.asm') diff --git a/src/syscall.asm b/src/syscall.asm index 0b47c05..2fc66b6 100644 --- a/src/syscall.asm +++ b/src/syscall.asm @@ -56,6 +56,7 @@ SyscallTable: dw sys_lookup ; 19 LOOKUP dw sys_ps ; 20 PS dw sys_progname ; 21 PROGNAME + dw sys_reap ; 22 REAP ; ----------------------------------------------------------------------------- sys_nosys: @@ -554,3 +555,60 @@ sys_progname:: xor a ld [de], a ret + +; ============================================================================= +; sys_reap() -> A = pid of a reaped zombie child, or 0 (never blocks). +; Used by the shell to clean up finished background jobs. +; ============================================================================= +sys_reap:: + ld a, [wCurProc] + add PROC_PID + ld l, a + ld a, [wCurProc+1] + adc 0 + ld h, a + ld a, [hl] + ld [wWaitMyPid], a + ld c, 0 +.scan + ld a, c + call PcbPtr ; DE = &PCB[c] + ld a, [de] + cp PS_ZOMBIE + jr nz, .next + ld h, d + ld l, e + ld a, l + add PROC_PARENT + ld l, a + ld a, h + adc 0 + ld h, a + ld a, [wWaitMyPid] + cp [hl] + jr nz, .next + ; reap: pid, free bank, free slot + ld h, d + ld l, e + inc hl ; PROC_PID + ld a, [hl] + ld [wWaitRetPid], a + ld a, e + add PROC_RAMB + ld l, a + ld a, d + adc 0 + ld h, a + ld a, [hl] + call FreeRamBank + ld a, PS_FREE + ld [de], a + ld a, [wWaitRetPid] + ret +.next + inc c + ld a, c + cp MAX_PROCS + jr c, .scan + xor a + ret -- cgit v1.3.1-sl0p