This commit is contained in:
Simon Cruanes 2024-04-02 12:44:36 -04:00
parent 83ada948aa
commit a127a4131a
No known key found for this signature in database
GPG key ID: EBFFF6F283F3A2B4
2 changed files with 31 additions and 21 deletions

View file

@ -22,8 +22,7 @@ start
1.4.2: cur fiber[4] is some: true 1.4.2: cur fiber[4] is some: true
1.4.3: res 4 = 4 1.4.3: res 4 = 4
2: main fiber done 2: main fiber done
3: other fib done 3: main fiber exited
4: main fiber exited
============ ============
start start
1: start fibers 1: start fibers

View file

@ -52,31 +52,42 @@ let () =
let clock = ref TS.init in let clock = ref TS.init in
let fib = let fib =
F.spawn_top ~on:runner @@ fun () -> F.spawn_top ~on:runner @@ fun () ->
let chan_progress = Chan.create () in
let chans = Array.init 5 (fun _ -> Chan.create ()) in
let subs = let subs =
List.init 5 (fun i -> List.init 5 (fun i ->
F.spawn ~protect:false @@ fun _n -> F.spawn ~protect:false @@ fun _n ->
Thread.delay (float i *. 0.01); Thread.delay (float i *. 0.01);
Chan.pop_await chans.(i);
Chan.push chan_progress i;
F.check_if_cancelled ();
i) i)
in in
F.spawn_ignore ~protect:false (fun _n ->
Thread.delay 0.4;
TS.tick clock;
logf !clock "other fib done");
logf (TS.tick_get clock) "wait for subs"; logf (TS.tick_get clock) "wait for subs";
List.iteri
(fun i f -> F.spawn_ignore (fun () ->
let clock = ref (0 :: i :: !clock) in for i = 0 to 4 do
logf !clock "await fiber %d" i; Chan.push chans.(i) ();
logf (TS.tick_get clock) "cur fiber[%d] is some: %b" i let i' = Chan.pop_await chan_progress in
(Option.is_some @@ F.Private_.get_cur ()); assert (i = i')
let res = F.await f in done);
logf (TS.tick_get clock) "cur fiber[%d] is some: %b" i
(Option.is_some @@ F.Private_.get_cur ()); (let clock0 = !clock in
F.yield (); List.iteri
logf (TS.tick_get clock) "res %d = %d" i res) (fun i f ->
subs; let clock = ref (0 :: i :: clock0) in
logf !clock "await fiber %d" i;
logf (TS.tick_get clock) "cur fiber[%d] is some: %b" i
(Option.is_some @@ F.Private_.get_cur ());
let res = F.await f in
logf (TS.tick_get clock) "cur fiber[%d] is some: %b" i
(Option.is_some @@ F.Private_.get_cur ());
F.yield ();
logf (TS.tick_get clock) "res %d = %d" i res)
subs);
logf (TS.tick_get clock) "main fiber done" logf (TS.tick_get clock) "main fiber done"
in in
@ -104,8 +115,9 @@ let () =
logf (TS.tick_get clock) "start fibers"; logf (TS.tick_get clock) "start fibers";
let subs = let subs =
let clock0 = !clock in
List.init 10 (fun i -> List.init 10 (fun i ->
let clock = ref (0 :: i :: !clock) in let clock = ref (0 :: i :: clock0) in
F.spawn ~protect:false @@ fun _n -> F.spawn ~protect:false @@ fun _n ->
let@ () = let@ () =
F.with_on_self_cancel (fun _ -> F.with_on_self_cancel (fun _ ->
@ -123,7 +135,6 @@ let () =
); );
F.check_if_cancelled (); F.check_if_cancelled ();
i) i)
in in