ref: 1882f1be4849ab34aa289e0f74fd6ffadb31a7fa
dir: /lib/thread/smoketest.myr/
use std use sys use thread var val : uint64 = 0 var done : uint32 = 0 var mtx : thread.mutex const atomicincvar = { var i for i = 0; i < 10_000_000; i++ thread.xadd(&val, 1) ;; std.write(1, "done\n") thread.xset(&done, 1) } const atomictest = { var i match thread.spawn(atomicincvar) | `std.Ok tid: for i = 0; i < 100_000; i++ thread.xadd(&val, 1) ;; while thread.xget(&done) == 0 /* nothing */ ;; std.assert(val == 10_100_000, "atomics are broken\n") | `std.Fail err: std.fatal("errno = {}\n", err) ;; } const mtxincvar = { var i for i = 0; i < 1_000_000; i++ thread.mtxlock(&mtx) val++ thread.mtxunlock(&mtx) ;; std.write(1, "done\n") thread.xset(&done, 1) } const mtxtest = { var i mtx = thread.mkmtx() match thread.spawn(mtxincvar) | `std.Ok tid: for i = 0; i < 1_000_000; i++ thread.mtxlock(&mtx) val++ thread.mtxunlock(&mtx) ;; while thread.xget(&done) == 0 /* nothing */ ;; if val != 2_000_000 std.fatal("mutexes are broken, got {}\n", val) ;; | `std.Fail err: std.fatal("errno = {}\n", err) ;; } const main = { val = 0 atomictest() val = 0 mtxtest() }