Skip to content

Commit 04ed8a9

Browse files
committed
initial precond support: generate and filter
1 parent c1143d0 commit 04ed8a9

File tree

1 file changed

+39
-8
lines changed

1 file changed

+39
-8
lines changed

lib/STM.ml

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,35 @@ struct
171171
let res_arr = Array.map (fun c -> Domain.cpu_relax(); Spec.run c sut) cs_arr in
172172
List.combine cs (Array.to_list res_arr)
173173

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
175203
| p::pref' ->
176204
let b,s' = check_and_next p s in
177205
b && check_obs pref' cs1 cs2 s'
@@ -197,7 +225,7 @@ struct
197225
let open Iter in
198226
let shrink_cmd = Option.value Spec.(arb_cmd init_state).shrink ~default:Shrink.nil in
199227
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)
201229
(fun (seq,p1,p2) ->
202230
(map (fun seq' -> (seq',p1,p2)) (Shrink.list ~shrink:shrink_cmd seq))
203231
<+>
@@ -213,16 +241,18 @@ struct
213241
let seq_pref_gen = gen_cmds_size Spec.init_state (Gen.int_bound seq_len) in
214242
let gen_triple =
215243
Gen.(seq_pref_gen >>= fun seq_pref ->
244+
int_range 2 (2*par_len) >>= fun dbl_plen ->
216245
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
219250
make ~print:(print_triple_vertical Spec.show_cmd) ~shrink:shrink_triple gen_triple
220251

221252
(* Parallel agreement property based on [Domain] *)
222253
let agree_prop_par =
223254
(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);
226256
let sut = Spec.init_sut () in
227257
let pref_obs = interp_sut_res sut seq_pref in
228258
let wait = Atomic.make true in
@@ -239,9 +269,10 @@ struct
239269

240270
(* Parallel agreement test based on [Domain] and [repeat] *)
241271
let agree_test_par ~count ~name =
242-
let rep_count = 50 in
272+
let rep_count = 25 in
243273
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)")
245276
(arb_cmds_par seq_len par_len)
246277
(repeat rep_count agree_prop_par)
247278

0 commit comments

Comments
 (0)