ref: 765ff439ba6b29b36c6df8ea3923fac9f5e39eaf
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#)
}