@@ -110,6 +110,49 @@ let test_cancel_after () =
110
110
(Exn_bt. get_callstack 0 Not_found );
111
111
Computation. await computation
112
112
113
+ let test_computation_completion_signals_triggers_in_lifo_order () =
114
+ let state = Random.State. make_self_init () in
115
+ let num_non_trivial = ref 0 in
116
+ for _ = 1 to 10 do
117
+ let computation = Computation. create () in
118
+ let signals = ref [] in
119
+ let triggers = ref [] in
120
+ let counter = ref 0 in
121
+ let attach_one () =
122
+ let trigger = Trigger. create () in
123
+ triggers := trigger :: ! triggers;
124
+ let i = ! counter in
125
+ counter := i + 1 ;
126
+ assert (Computation. try_attach computation trigger);
127
+ assert (
128
+ Trigger. on_signal trigger () () (fun _ _ _ -> signals := i :: ! signals))
129
+ in
130
+ let detach_one () =
131
+ let n = List. length ! triggers in
132
+ if 0 < n then begin
133
+ let bits = Random.State. bits state in
134
+ let i = bits mod n in
135
+ let trigger = List. nth ! triggers i in
136
+ triggers := List. filter (( != ) trigger) ! triggers;
137
+ Computation. detach computation trigger
138
+ end
139
+ in
140
+ for _ = 1 to 10 do
141
+ for _ = 1 to 10 do
142
+ let bits = Random.State. bits state in
143
+ if bits land 3 < = 2 then attach_one () else detach_one ()
144
+ done ;
145
+ for _ = 1 to List. length ! triggers / 3 do
146
+ detach_one ()
147
+ done
148
+ done ;
149
+ if List. length ! triggers > = 2 then incr num_non_trivial;
150
+ signals := [] ;
151
+ Computation. finish computation;
152
+ assert (! signals = List. sort Int. compare ! signals)
153
+ done ;
154
+ assert (0 < ! num_non_trivial)
155
+
113
156
let () =
114
157
[
115
158
(" DLS is lazy" , [ Alcotest. test_case " " `Quick test_dls_is_lazy ]);
@@ -120,5 +163,10 @@ let () =
120
163
( " Thread cancelation" ,
121
164
[ Alcotest. test_case " " `Quick test_thread_cancelation ] );
122
165
(" Cancel after" , [ Alcotest. test_case " " `Quick test_cancel_after ]);
166
+ ( " Computation signals in LIFO order" ,
167
+ [
168
+ Alcotest. test_case " " `Quick
169
+ test_computation_completion_signals_triggers_in_lifo_order;
170
+ ] );
123
171
]
124
172
|> Alcotest. run " Picos"
0 commit comments