shithub: mc

ref: 1882f1be4849ab34aa289e0f74fd6ffadb31a7fa
dir: /lib/thread/smoketest.myr/

View raw version
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()
}