shithub: mc

ref: 4eae5641fda676dbb1085560b993971d32b38935
dir: /libstd/wait+linux.myr/

View raw version
use sys

use "die.use"
use "syswrap.use"

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

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

const wait = {pid
	var st

:again
	if sys.waitpid(pid castto(sys.pid), &st, 0) > 0
		if st & 0x7f == 0 /* if exited */
			if ((st & 0xff00) >> 8) == 0
				-> `Wsuccess
			else
				-> `Wfailure
			;;
		elif ((st & 0xffff)-1) < 0xff /* if signaled */
			-> `Wsignal
		elif (((st & 0xffff)*0x10001)>>8) > 0x7f00
			/* 
			when a process stops, eg, if paused by a debugger,
			wait() will return. This API is for waiting until
			a process exits. Loop instead.
			*/
			goto again
		;;
	;;
	-> `Waiterror
}