32e9efa5创建于 2024年1月21日历史提交
[@@@warning "-8"]

open Riot

exception Fail

let get_sid pid =
  match Seq.find (fun (p, _proc) -> Pid.equal pid p) (processes ()) with
  | Some (_pid, proc) -> Process.sid proc
  | None -> raise Not_found

let main () =
  let _ = Logger.start () |> Result.get_ok in
  (* Runtime.set_log_level (Some Debug); *)
  Logger.set_log_level (Some Debug);
  Runtime.Stats.start ~every:1_000_000L ();

  let _scheduler_hogger =
    spawn_pinned (fun () ->
        Logger.info (fun f -> f "hogger %a" Pid.pp (self ()));
        let i = ref 0 in
        while true do
          i := !i + 1;
          if !i mod 100000 = 0 then yield ()
        done)
  in

  let pid =
    spawn_pinned (fun () ->
        Logger.info (fun f -> f "pid %a" Pid.pp (self ()));
        let rec sleep_loop () =
          yield ();
          sleep_loop ()
        in
        sleep_loop ())
  in
  Logger.info (fun f -> f "spinning up processes");

  let last_sid = get_sid pid in
  let rec check_loop iters =
    if iters = 0 then (
      Logger.error (fun f ->
          f "process_stealing_test: process was not stolen by another scheduler");
      raise Fail);
    let current_sid = get_sid pid in
    if not (Core.Scheduler_uid.equal last_sid current_sid) then
      Logger.info (fun f -> f "process_stealing_test: OK")
    else check_loop (iters - 1)
  in
  check_loop 10000

let () = run ~workers:2 @@ main