ref: 3d4d7c4ca9eb30d468d71c26f4b4588c800c9d1c
dir: /lib/thread/waitgrp+futex.myr/
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") }