ref: db048ccb7e6b80bcd2f5cf60f409d9b31a21dafe
dir: /lib/thread/spawn+osx.myr/
use sys use std pkg thread = type tid = uint64 const spawn : (fn : (-> void) -> std.result(tid, byte[:])) ;; const Stacksz = 8*std.MiB extern const exit : (-> void) extern const start : (-> void) const __init__ = { var ret ret = sys.bsdthread_register(\ start castto(void#), \ /* start */ 0 castto(void#), \ /* wqthread */ 0 castto(uint32), \ /* sz */ 0 castto(uint32), \ /* dummy */ 0 castto(void#), \ /* targconc */ 0 castto(uint32)) /* queueoff */ if ret < 0 std.fatal("unable to init threads: {}", ret) ;; } const spawn = {fn -> spawnstk(fn, Stacksz) } const spawnstk = {fn, sz var tid : tid, ret std.put("...hi? fn={}\n", fn castto(void#)) ret = sys.bsdthread_create( \ fn castto(void#), \ envptr(&fn), \ sz castto(void#), \ 0 castto(void#), \ 0) if ret == (-1 castto(void#)) -> `std.Fail "couldn't spawn thread" ;; -> `std.Ok ret castto(tid) } const envptr = {fn var repr : std.intptr[2] repr = (fn castto(std.intptr[2]#))# -> repr[0] castto(void#) }