ref: 7b5b914cf702375f8f532c2fe43c04d6eacd1fd6
dir: /lib/thread/futex+linux.myr/
use sys use "common" pkg thread = type ftxtag = uint32 impl atomic ftxtag const ftxwait : (uaddr : ftxtag#, val : ftxtag, timeout : sys.timespec# -> int) const ftxwake : (uaddr : ftxtag# -> int) ;; const ftxwait = {uaddr, val, timeout -> (sys.futex((uaddr : int32#), sys.Futexwait | sys.Futexpriv, (val : int32), timeout, Zptr, 0) : int) } const ftxwake = {uaddr -> (sys.futex((uaddr : int32#), sys.Futexwake | sys.Futexpriv, 1, Zptr, Zptr, 0) : int) } impl atomic ftxtag = xget = {p; -> (xget32((p : uint32#)) : ftxtag)} xset = {p, v; xset32((p : uint32#), (v : uint32))} xadd = {p, v; -> (xadd32((p : uint32#), (v : uint32)) : ftxtag)} xcas = {p, old, new; -> (xcas32((p : uint32#), (old : uint32), (new : uint32)) : ftxtag)} xchg = {p, v; -> (xchg32((p : uint32#), (v : uint32)) : ftxtag)} ;; extern const xget32 : (p : uint32# -> uint32) extern const xset32 : (p : uint32#, v : uint32 -> void) extern const xadd32 : (p : uint32#, v : uint32 -> uint32) extern const xcas32 : (p : uint32#, old: uint32, new : uint32 -> uint32) extern const xchg32 : (p : uint32#, v : uint32 -> uint32)