shithub: mc

ref: d626bfc93b1df80a39432a0077cc6febf056fee6
dir: /lib/std/wait+posixy.myr/

View raw version
use sys

use "die"
use "syswrap"

pkg std =
	type waitstatus = union
		`Wsuccess
		`Wfailure
		`Wsignalled
		`Waiterror
	;;

	const wait	: (pid : pid -> waitstatus)
;;

const wait = {pid
	var st

:again
	if sys.waitpid((pid : sys.pid), &st, 0) > 0
		match sys.waitstatus(st)
		/* 
		when a process stops, eg, if paused by a debugger,
		wait() will return. This API is for waiting until
		a process exits. Loop instead.
		*/
		| `sys.Waitstop sig:	goto again
		| `sys.Waitfail fail:	-> `Waiterror
		| `sys.Waitsig sig:	-> `Wsignalled
		| `sys.Waitexit status:
			if status == 0
				-> `Wsuccess
			else
				-> `Wfailure
			;;
		;;
	;;
	-> `Waiterror
}