shithub: mc

ref: 321aec6bf2b82698196a94725e37cee135b1fe2b
dir: /lib/thread/future.myr/

View raw version
use std

use "sem"

pkg thread =
	type future(@a) = struct
		sem	: sem
		val	: @a
	;;

	generic mkfut	: (-> future(@a)#)
	generic futput	: (fut : future(@a)#, val : @a -> void)
	generic futget	: (fut : future(@a)# -> @a)
;;

generic mkfut = {
	-> std.mk([.sem = mksem(0)])
}

generic futput = {fut, val
	fut.val = val
	sempost(&fut.sem)
}

generic futget = {fut
	var val
	
	semwait(&fut.sem)
	val = fut.val
	std.free(fut)
	-> val
}