@@ -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+
313329let 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
372388let 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+
374397let 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
0 commit comments