1- let [@ inline never] error_awaiting () = invalid_arg " already awaiting"
1+ let [@ inline never] error_awaiting _ = invalid_arg " already awaiting"
22
33type state =
44 | Signaled
@@ -7,38 +7,45 @@ type state =
77
88and t = state Atomic. t
99
10- let create () = Atomic. make Initial
11- let is_signaled t = Atomic. get t == Signaled
12-
13- let is_initial t =
14- match Atomic. get t with
15- | Initial -> true
16- | Awaiting _ -> error_awaiting ()
17- | Signaled -> false
18-
19- let rec finish t ~allow_awaiting =
10+ let finish t ~allow_awaiting =
2011 match Atomic. get t with
2112 | Signaled -> ()
2213 | Awaiting r as before ->
23- if allow_awaiting then
14+ if allow_awaiting then begin
2415 if Atomic. compare_and_set t before Signaled then r.action t r.x r.y
25- else finish t ~allow_awaiting
26- else error_awaiting ()
16+ end
17+ else error_awaiting before
2718 | Initial ->
28- if not (Atomic. compare_and_set t Initial Signaled ) then
29- finish t ~allow_awaiting
30-
31- let signal t = finish t ~allow_awaiting: true
32- let dispose t = finish t ~allow_awaiting: false
33-
34- let rec on_signal t x y action =
19+ if not (Atomic. compare_and_set t Initial Signaled ) then begin
20+ match Atomic. get t with
21+ | Signaled | Initial -> ()
22+ | Awaiting r as before ->
23+ if allow_awaiting && Atomic. compare_and_set t before Signaled then
24+ r.action t r.x r.y
25+ end
26+
27+ let on_signal t x y action =
3528 match Atomic. get t with
3629 | Signaled -> false
37- | Awaiting _ -> error_awaiting ()
38- | Initial ->
30+ | Awaiting _ as any -> error_awaiting any
31+ | Initial -> begin
3932 let success =
4033 Atomic. compare_and_set t Initial (Awaiting { action; x; y })
4134 in
42- if success then success else on_signal t x y action
35+ if success then success
36+ else
37+ match Atomic. get t with Signaled -> false | any -> error_awaiting any
38+ end
39+
40+ let [@ inline] create () = Atomic. make Initial
41+
42+ let [@ inline] is_initial t =
43+ match Atomic. get t with
44+ | Initial -> true
45+ | Awaiting _ as any -> error_awaiting any
46+ | Signaled -> false
4347
44- let from_action x y action = Atomic. make (Awaiting { action; x; y })
48+ let [@ inline] from_action x y action = Atomic. make (Awaiting { action; x; y })
49+ let [@ inline] is_signaled t = Atomic. get t == Signaled
50+ let [@ inline] signal t = finish t ~allow_awaiting: true
51+ let [@ inline] dispose t = finish t ~allow_awaiting: false
0 commit comments