summaryrefslogtreecommitdiff
path: root/lib/thread/spawn+plan9.myr
blob: 22b63f8d84379a9d5be6be0d34d08bf87e7b0b4c (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
use std
use sys
use "tls"

pkg thread =
	type tid = uint64

	const spawn : (fn : (-> void) -> std.result(tid, byte[:]))
;;

const spawn = {fn
	var p, s

	fn = std.fndup(fn)
	match sys.rfork(sys.Rfproc | sys.Rfmem)
	| 0:
		if ntlsslots > Staticcap
			p = getpriv()
			s = std.slalloc(ntlsslots)
			p[0] = (s : void#)
		;;
		fn()
		std.fnfree(fn)
		if ntlsslots > Staticcap
			p = getpriv()
			s = (p[0] : void##)[:ntlsslots]
			std.slfree(s)
		;;
		std.exit(0)
	| -1:	
		std.fnfree(fn)
		-> `std.Err "unable to spawn thread"
	| thr:	-> `std.Ok (thr : tid)
	;;
}