summaryrefslogtreecommitdiff
path: root/lib/std/wait+posixy.myr
blob: a690feb3f08fe209edab672bf244d28289d78b7b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
use sys

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

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

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

const wait = {pid
	var st

:again
	if sys.waitpid(pid castto(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
}