shithub: mc

ref: ed5a96dec13db05df59e4af350be066f2c57efd2
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
}