1
1
(* * Treiber's Lock Free stack *)
2
2
3
- type 'a node = Nil | Next of 'a * 'a node Atomic .t
3
+ type 'a node = Nil | Next of 'a * 'a node
4
4
type 'a t = { head : 'a node Atomic .t }
5
5
6
6
let create () =
@@ -11,8 +11,7 @@ let is_empty q = match Atomic.get q.head with Nil -> true | Next _ -> false
11
11
12
12
let push q v =
13
13
let head = Atomic. get q.head in
14
- let next_node = Atomic. make head in
15
- let new_node = Next (v, next_node) in
14
+ let new_node = Next (v, head) in
16
15
if Atomic. compare_and_set q.head head new_node then ()
17
16
else
18
17
let b = Backoff. create () in
@@ -21,7 +20,7 @@ let push q v =
21
20
(* retry *)
22
21
let rec loop b =
23
22
let head = Atomic. get q.head in
24
- Atomic. set next_node head;
23
+ let new_node = Next (v, head) in
25
24
if Atomic. compare_and_set q.head head new_node then ()
26
25
else (
27
26
Backoff. once b;
@@ -35,7 +34,7 @@ let pop q =
35
34
match s with
36
35
| Nil -> None
37
36
| Next (v , next ) ->
38
- if Atomic. compare_and_set q.head s ( Atomic. get next) then Some v
37
+ if Atomic. compare_and_set q.head s next then Some v
39
38
else (
40
39
Backoff. once b;
41
40
loop b)
@@ -45,7 +44,7 @@ let pop q =
45
44
match s with
46
45
| Nil -> None
47
46
| Next (v , next ) ->
48
- if Atomic. compare_and_set q.head s ( Atomic. get next) then Some v
47
+ if Atomic. compare_and_set q.head s next then Some v
49
48
else
50
49
let b = Backoff. create () in
51
50
Backoff. once b;
0 commit comments