ref: 1ee90265d5f764cb54b49531c4b247c5f404491c
dir: /lib/thread/mutex.myr/
use std use sys use "atomic" use "common" pkg thread = type mutex = struct _state : uint32 ;; const mkmtx : (-> mutex) const mtxlock : (mtx : mutex# -> void) const mtxtrylock : (mtx : mutex# -> bool) const mtxunlock : (mtx : mutex# -> void) ;; const mkmtx = { -> [._state = 0] } /* a shitty spinlock */ const mtxlock = {mtx /* first fast */ for var i = 0; i < 1000; i++ if xcas(&mtx._state, 0, 1) == 0 -> void ;; std.nanosleep(0) ;; /* then slower */ for var i = 0; i < 1000; i++ if xcas(&mtx._state, 0, 1) == 0 -> void ;; std.nanosleep(10_000) /* 10 us */ ;; /* even slower */ for var i = 0; i < 1000; i++ if xcas(&mtx._state, 0, 1) == 0 -> void ;; std.nanosleep(100_000) /* 100 us */ ;; /* I'm rip van winkle! */ while true if xcas(&mtx._state, 0, 1) == 0 -> void ;; std.nanosleep(1000_000) /* 1 ms */ ;; } const mtxtrylock = {mtx -> xcas(&mtx._state, 0, 1) == 0 } const mtxunlock = {mtx xset(&mtx._state, 0) }