Skip to content

Commit 397684c

Browse files
committed
Unify type of select_of_many
1 parent 78153b3 commit 397684c

File tree

3 files changed

+9
-8
lines changed

3 files changed

+9
-8
lines changed

bench/bench_select.ml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,12 @@ let run env =
4040
let dom_mgr = domain_mgr env in
4141
let clock = clock env in
4242
let streams = make_streams sender_fibers in
43+
let selector = List.map (fun s -> (s, fun i -> i)) streams in
4344
let n_msgs = 10000 in
4445
Switch.run @@ fun sw ->
4546
Fiber.fork ~sw (fun () -> run_senders ~dom_mgr ~n_msgs streams);
4647
let before = Time.now clock in
47-
receiver ~n_msgs:(sender_fibers * n_msgs) streams;
48+
receiver ~n_msgs:(sender_fibers * n_msgs) selector;
4849
let after = Time.now clock in
4950
let elapsed = after -. before in
5051
let time_per_iter = elapsed /. (Float.of_int @@ sender_fibers * n_msgs) in

lib_eio/sync.ml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -389,13 +389,13 @@ let rec consumer_resume_cell t ~success ?in_transition cell =
389389
if Atomic.compare_and_set cell old Finished then success req
390390
else consumer_resume_cell t ~success ?in_transition cell
391391

392-
let take_suspend_select ~enqueue ~ctx ~cancel_all t loc finished =
392+
let take_suspend_select ~enqueue ~ctx ~cancel_all t f loc finished =
393393
let Short cell | Long (_, cell) = loc in
394394
let kc v = begin
395395
if (Atomic.compare_and_set finished false true) then (
396396
cancel_all ();
397397
(* deliver value *)
398-
enqueue (Ok v);
398+
enqueue (Ok (f v));
399399
true
400400
) else (
401401
(* reject value, let producer try again *)
@@ -447,12 +447,12 @@ let take (t : _ t) =
447447
take_suspend t (Long (Q.next_suspend t.consumers))
448448
)
449449

450-
let select_of_many (type a) (ts: a t list) =
450+
let select_of_many (type a b) (ts: (a t * (a -> b)) list) =
451451
let finished = Atomic.make false in
452452
let cancel_fns = ref [] in
453453
let add_cancel_fn fn = cancel_fns := (fn :: !cancel_fns) in
454454
let cancel_all () = List.iter (fun fn -> fn ()) !cancel_fns in
455-
let wait ctx enqueue (t: a t) = begin
455+
let wait ctx enqueue ((t, f): (a t * (a -> b))) = begin
456456
if (Atomic.fetch_and_add t.balance (-1)) > 0 then (
457457
(* have item, can cancel remaining stream waiters*)
458458
if Atomic.compare_and_set finished false true then (
@@ -464,14 +464,14 @@ let select_of_many (type a) (ts: a t list) =
464464
let v = consumer_resume_cell t cell
465465
~success:(fun it -> it.kp (Ok true); it.v)
466466
?in_transition:None in
467-
enqueue (Ok v)
467+
enqueue (Ok (f v))
468468
) else (
469469
(* restore old balance, because another stream was ready first. *)
470470
ignore (Atomic.fetch_and_add t.balance (+1))
471471
)
472472
) else (
473473
let cell = Long (Q.next_suspend t.consumers) in
474-
let cancel_fn = take_suspend_select ~enqueue ~ctx ~cancel_all t cell finished in
474+
let cancel_fn = take_suspend_select ~enqueue ~ctx ~cancel_all t f cell finished in
475475
add_cancel_fn cancel_fn
476476
)
477477
end in

lib_eio/sync.mli

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,5 +51,5 @@ val balance : 'a t -> int
5151
val dump : 'a t Fmt.t
5252
(** [dump] formats the internal state of a channel, for testing and debugging. *)
5353

54-
val select_of_many : 'a t list -> 'a
54+
val select_of_many : ('a t * ('a -> 'b)) list -> 'b
5555
(** alpha: [select_of_many] returns an element from the first sync stream to yield an item. *)

0 commit comments

Comments
 (0)