A thread is a task sharing the caller's address space. New private syscalls thread_spawn(entry, stack_top, arg)=37 and thread_exit=38: thread_spawn goes through scheduler.spawnThread (retains the shared aspace), thread_exit ends the task like a process exit(0) (terminateCurrent -> releaseAspace, so the space survives while siblings hold it). The closure pointer reaches the new thread in rdi via a new jump_to_user_arg asm path and a per-task user_arg (0 for a normal process, whose _start ignores it) - so the runtime trampoline is a plain C-ABI Zig function, no naked asm. runtime.Thread (library/runtime/thread.zig) mirrors std.Thread.spawn: mmap a stack, heap-allocate the args closure, hand the kernel the trampoline + closure. addThreadedUserBinary opts a binary into single_threaded=false; thread-test is the first, and proves a worker runs in the shared address space via a shared global the main thread polls. Gate thread-spawn PASS; 16 guardrail cases green (incl. args/init/process on the new jump_to_user_arg path) + aspace-refcount; build + host tests clean. |
||
|---|---|---|
| .. | ||
| block.zig | ||
| device.zig | ||
| display.zig | ||
| dma.zig | ||
| fs.zig | ||
| heap.zig | ||
| input.zig | ||
| ipc.zig | ||
| process.zig | ||
| root.zig | ||
| runtime.zig | ||
| service.zig | ||
| shm.zig | ||
| start.zig | ||
| system-call.zig | ||
| system.zig | ||
| thread.zig | ||
| time.zig | ||
| usb.zig | ||
| user.ld | ||