Skip to content

Commit d924d2a

Browse files
Merge pull request #21 from ocaml-multicore/program-gen
Test generation
2 parents ec5dff7 + e849cc9 commit d924d2a

8 files changed

+408
-4
lines changed

dscheck.opam

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ depends: [
1313
"tsort"
1414
"oseq"
1515
"alcotest" {>= "1.6.0" & with-test}
16+
"cmdliner"
1617
"odoc" {with-doc}
1718
]
1819
build: [

dune-project

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,6 @@
1111
(package
1212
(name dscheck)
1313
(synopsis "Traced Atomics")
14-
(depends (ocaml (>= 5.0.0)) dune containers tsort oseq (alcotest (and (>= 1.6.0) :with-test))))
14+
(depends (ocaml (>= 5.0.0)) dune containers tsort oseq (alcotest (and (>= 1.6.0) :with-test)) cmdliner))
1515

1616

src/trace_tracker.ml

+3
Original file line numberDiff line numberDiff line change
@@ -101,3 +101,6 @@ let equal t1 t2 =
101101
(* any values under the same key are known to be equivalent, even if the exact sequence is not identical *))
102102
t1 t2
103103
== 0
104+
105+
let subset t1 t2 =
106+
TraceMap.fold (fun key _ seen_all -> TraceMap.mem key t2 && seen_all) t1 true

src/trace_tracker.mli

+1
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@ val print_traces : out_channel -> unit
77
val print : t -> out_channel -> unit
88
val equal : t -> t -> bool
99
val get_deps_str : t -> string
10+
val subset : t -> t -> bool

src/tracedAtomic.ml

+25-2
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,22 @@ let do_run init_func init_schedule =
310310
backtrack = IntSet.empty;
311311
}
312312

313+
let rec explore_random func state =
314+
let s = last_element state in
315+
let enabled = IntSet.to_seq s.enabled |> List.of_seq in
316+
let len = List.length enabled in
317+
if len == 0 then ()
318+
else
319+
let random_index = Random.int len in
320+
let j = List.nth enabled random_index in
321+
let j_proc = List.nth s.procs j in
322+
let schedule =
323+
List.map (fun s -> (s.run_proc, s.run_op, s.run_ptr)) state
324+
@ [ (j, j_proc.op, j_proc.obj_ptr) ]
325+
in
326+
let statedash = state @ [ do_run func schedule ] in
327+
explore_random func statedash
328+
313329
let rec explore func state clock last_access =
314330
let s = last_element state in
315331
List.iter
@@ -371,18 +387,25 @@ let reset_state () =
371387

372388
let dscheck_trace_file_env = Sys.getenv_opt "dscheck_trace_file"
373389

390+
let random func iters =
391+
reset_state ();
392+
let empty_state = do_run func [ (0, Start, None) ] :: [] in
393+
for _ = 1 to iters do
394+
explore_random func empty_state
395+
done
396+
374397
let dpor func =
375398
reset_state ();
376399
let empty_state = do_run func [ (0, Start, None) ] :: [] in
377400
let empty_clock = IntMap.empty in
378401
let empty_last_access = IntMap.empty in
379402
explore func empty_state empty_clock empty_last_access
380403

381-
let trace ?interleavings ?(record_traces = false) func =
404+
let trace ?(impl = `Dpor) ?interleavings ?(record_traces = false) func =
382405
record_traces_flag := record_traces || Option.is_some dscheck_trace_file_env;
383406
interleavings_chan := interleavings;
384407

385-
dpor func;
408+
(match impl with `Dpor -> dpor func | `Random iters -> random func iters);
386409

387410
(* print reports *)
388411
(match !interleavings_chan with

src/tracedAtomic.mli

+7-1
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,15 @@ val decr : int t -> unit
4747
(** [decr r] atomically decrements the value of [r] by [1]. *)
4848

4949
val trace :
50-
?interleavings:out_channel -> ?record_traces:bool -> (unit -> unit) -> unit
50+
?impl:[ `Random of int | `Dpor ] ->
51+
?interleavings:out_channel ->
52+
?record_traces:bool ->
53+
(unit -> unit) ->
54+
unit
5155
(** [trace ?interleavings ?record_traces f] starts the simulation trace.
5256
57+
[impl] lets user choose the underlying exploration algorithm.
58+
5359
If [interleavings] output channel is provided, DSCheck will continously
5460
print the visited interleavings there.
5561

tests/dune

+5
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,8 @@
3737
(name test_conditional_ssb)
3838
(libraries dscheck alcotest)
3939
(modules test_conditional_ssb))
40+
41+
(executable
42+
(name gen_program)
43+
(libraries dscheck cmdliner)
44+
(modules gen_program))

0 commit comments

Comments
 (0)