@@ -310,6 +310,22 @@ let do_run init_func init_schedule =
310
310
backtrack = IntSet. empty;
311
311
}
312
312
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
+
313
329
let rec explore func state clock last_access =
314
330
let s = last_element state in
315
331
List. iter
@@ -371,18 +387,25 @@ let reset_state () =
371
387
372
388
let dscheck_trace_file_env = Sys. getenv_opt " dscheck_trace_file"
373
389
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
+
374
397
let dpor func =
375
398
reset_state () ;
376
399
let empty_state = do_run func [ (0 , Start , None ) ] :: [] in
377
400
let empty_clock = IntMap. empty in
378
401
let empty_last_access = IntMap. empty in
379
402
explore func empty_state empty_clock empty_last_access
380
403
381
- let trace ?interleavings ?(record_traces = false ) func =
404
+ let trace ?( impl = `Dpor ) ? interleavings ?(record_traces = false ) func =
382
405
record_traces_flag := record_traces || Option. is_some dscheck_trace_file_env;
383
406
interleavings_chan := interleavings;
384
407
385
- dpor func;
408
+ ( match impl with `Dpor -> dpor func | `Random iters -> random func iters) ;
386
409
387
410
(* print reports *)
388
411
(match ! interleavings_chan with
0 commit comments