Skip to content

Commit fe5fe96

Browse files
committed
Minor performance tweaks
Trigger operations do not need to be recursive.
1 parent b458d65 commit fe5fe96

File tree

1 file changed

+32
-25
lines changed

1 file changed

+32
-25
lines changed

lib/picos/trigger.bootstrap.ml

Lines changed: 32 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
let[@inline never] error_awaiting () = invalid_arg "already awaiting"
1+
let[@inline never] error_awaiting _ = invalid_arg "already awaiting"
22

33
type state =
44
| Signaled
@@ -7,38 +7,45 @@ type state =
77

88
and 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

Comments
 (0)