@@ -171,7 +171,35 @@ struct
171
171
let res_arr = Array. map (fun c -> Domain. cpu_relax() ; Spec. run c sut) cs_arr in
172
172
List. combine cs (Array. to_list res_arr)
173
173
174
- let rec check_obs pref cs1 cs2 s = match pref with
174
+ (* checks that all interleavings of a cmd triple satisfies all preconditions *)
175
+ let rec all_interleavings_ok pref cs1 cs2 s =
176
+ match pref with
177
+ | c ::pref' ->
178
+ Spec. precond c s &&
179
+ let s' = Spec. next_state c s in
180
+ all_interleavings_ok pref' cs1 cs2 s'
181
+ | [] ->
182
+ match cs1,cs2 with
183
+ | [] ,[] -> true
184
+ | [] ,c2 ::cs2' ->
185
+ Spec. precond c2 s &&
186
+ let s' = Spec. next_state c2 s in
187
+ all_interleavings_ok pref cs1 cs2' s'
188
+ | c1 ::cs1' ,[] ->
189
+ Spec. precond c1 s &&
190
+ let s' = Spec. next_state c1 s in
191
+ all_interleavings_ok pref cs1' cs2 s'
192
+ | c1 ::cs1' ,c2 ::cs2' ->
193
+ (Spec. precond c1 s &&
194
+ let s' = Spec. next_state c1 s in
195
+ all_interleavings_ok pref cs1' cs2 s')
196
+ &&
197
+ (Spec. precond c2 s &&
198
+ let s' = Spec. next_state c2 s in
199
+ all_interleavings_ok pref cs1 cs2' s')
200
+
201
+ let rec check_obs pref cs1 cs2 s =
202
+ match pref with
175
203
| p ::pref' ->
176
204
let b,s' = check_and_next p s in
177
205
b && check_obs pref' cs1 cs2 s'
@@ -197,7 +225,7 @@ struct
197
225
let open Iter in
198
226
let shrink_cmd = Option. value Spec. (arb_cmd init_state).shrink ~default: Shrink. nil in
199
227
Shrink. filter
200
- (fun (seq ,p1 ,p2 ) -> cmds_ok Spec. init_state ( seq@ p1) && cmds_ok Spec. init_state (seq @ p2) )
228
+ (fun (seq ,p1 ,p2 ) -> all_interleavings_ok seq p1 p2 Spec. init_state)
201
229
(fun (seq ,p1 ,p2 ) ->
202
230
(map (fun seq' -> (seq',p1,p2)) (Shrink. list ~shrink: shrink_cmd seq))
203
231
< +>
@@ -213,16 +241,18 @@ struct
213
241
let seq_pref_gen = gen_cmds_size Spec. init_state (Gen. int_bound seq_len) in
214
242
let gen_triple =
215
243
Gen. (seq_pref_gen >> = fun seq_pref ->
244
+ int_range 2 (2 * par_len) >> = fun dbl_plen ->
216
245
let spawn_state = List. fold_left (fun st c -> Spec. next_state c st) Spec. init_state seq_pref in
217
- let par = gen_cmds_size spawn_state (Gen. int_bound par_len) in
218
- map2 (fun par1 par2 -> (seq_pref,par1,par2)) par par) in
246
+ let par_len1 = dbl_plen/ 2 in
247
+ let par_gen1 = gen_cmds_size spawn_state (return par_len1) in
248
+ let par_gen2 = gen_cmds_size spawn_state (return (dbl_plen - par_len1)) in
249
+ triple (return seq_pref) par_gen1 par_gen2) in
219
250
make ~print: (print_triple_vertical Spec. show_cmd) ~shrink: shrink_triple gen_triple
220
251
221
252
(* Parallel agreement property based on [Domain] *)
222
253
let agree_prop_par =
223
254
(fun (seq_pref ,cmds1 ,cmds2 ) ->
224
- assume (cmds_ok Spec. init_state (seq_pref@ cmds1));
225
- assume (cmds_ok Spec. init_state (seq_pref@ cmds2));
255
+ assume (all_interleavings_ok seq_pref cmds1 cmds2 Spec. init_state);
226
256
let sut = Spec. init_sut () in
227
257
let pref_obs = interp_sut_res sut seq_pref in
228
258
let wait = Atomic. make true in
@@ -239,9 +269,10 @@ struct
239
269
240
270
(* Parallel agreement test based on [Domain] and [repeat] *)
241
271
let agree_test_par ~count ~name =
242
- let rep_count = 50 in
272
+ let rep_count = 25 in
243
273
let seq_len,par_len = 20 ,12 in
244
- Test. make ~count ~name: (" parallel " ^ name ^ " (w/repeat)" )
274
+ let max_gen = 2 * count in (* precond filtering may require extra generation: max. 2*count though *)
275
+ Test. make ~retries: 15 ~max_gen ~count ~name: (" parallel " ^ name ^ " (w/repeat)" )
245
276
(arb_cmds_par seq_len par_len)
246
277
(repeat rep_count agree_prop_par)
247
278
0 commit comments