[@@@ifge 4.12] include Atomic [@@@else_] open Stdlib (* for == *) type 'a t = { mutable x: 'a } let[@inline] make x = { x } let[@inline] get { x } = x let[@inline] set r x = r.x <- x let[@inline never] exchange r x = (* atomic *) let y = r.x in r.x <- x; (* atomic *) y let[@inline never] compare_and_set r seen v = (* atomic *) if r.x == seen then ( r.x <- v; (* atomic *) true ) else false let[@inline never] fetch_and_add r x = (* atomic *) let v = r.x in r.x <- x + r.x; (* atomic *) v let[@inline never] incr r = (* atomic *) r.x <- 1 + r.x (* atomic *) let[@inline never] decr r = (* atomic *) r.x <- r.x - 1 (* atomic *) [@@@endif]