summaryrefslogtreecommitdiff
path: root/lib/thread/waitgrp+futex.myr
blob: 701d8f04cb0dce66682e2b023dc600b75834884d (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
use std

use "atomic"
use "futex"

pkg thread =
	type waitgrp = struct
		_val : ftxtag
	;;

	const mkwg : (v : uint32 -> waitgrp)
	const wgwait : (w : waitgrp# -> void)
	const wgpost : (w : waitgrp# -> void)
;;

const mkwg = {v
	-> [._val = (v : ftxtag)]
}

const wgwait = {w
	var v = 0

	while (v = xget(&w._val)) != 0
		ftxwait(&w._val, v, -1)
	;;
}

const wgpost = {w
	var v = xadd(&w._val, -1)

	if v == 1
		ftxwakeall(&w._val)
		-> void
	;;
	std.assert(v > 0, "error: waitgroup underflowed\n")
}