Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Page
Library
Module
Module type
Parameter
Class
Class type
Source
atomic.ml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
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 = (* critical section *) let y = r.x in r.x <- x; (* end critical section *) y let[@inline never] compare_and_set r seen v = (* critical section *) if r.x == seen then ( r.x <- v; (* end critical section *) true ) else false let[@inline never] fetch_and_add r x = (* critical section *) let v = r.x in r.x <- x + r.x; (* end critical section *) v let[@inline never] incr r = (* critical section *) r.x <- 1 + r.x (* end critical section *) let[@inline never] decr r = (* critical section *) r.x <- r.x - 1 (* end critical section *)