shithub: mc

ref: 3d4d7c4ca9eb30d468d71c26f4b4588c800c9d1c
dir: /lib/thread/waitgrp+futex.myr/

View raw version
use std

use "atomic"
use "common"
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, Zptr)
	;;
}

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

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