From 753534b62e64d8a4baf4e30f196c397a7e98a423 Mon Sep 17 00:00:00 2001 From: Simon Cruanes Date: Mon, 12 Feb 2024 12:03:42 -0500 Subject: [PATCH] test: wip: tests for Fut+TLS --- test/dune | 1 + test/t_fut_tls.expected | 0 test/t_fut_tls.ml | 42 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+) create mode 100644 test/t_fut_tls.expected create mode 100644 test/t_fut_tls.ml diff --git a/test/dune b/test/dune index 5c5e6427..2f6e4e54 100644 --- a/test/dune +++ b/test/dune @@ -12,6 +12,7 @@ t_unfair t_ws_deque t_ws_wait + t_fut_tls t_bounded_queue) (libraries moonpool diff --git a/test/t_fut_tls.expected b/test/t_fut_tls.expected new file mode 100644 index 00000000..e69de29b diff --git a/test/t_fut_tls.ml b/test/t_fut_tls.ml new file mode 100644 index 00000000..a88e9ff7 --- /dev/null +++ b/test/t_fut_tls.ml @@ -0,0 +1,42 @@ +open Moonpool + +let ( let@ ) = ( @@ ) + +let k_ints : int list Task_local_storage.key = + Task_local_storage.new_key ~init:(fun () -> []) () + +let rec task idx i : unit Fut.t = + let open Fut.Infix in + if i = 0 then + Fut.return () + else ( + let l = Task_local_storage.get k_ints in + Task_local_storage.set k_ints @@ (((idx * 100) + i) :: l); + let* () = task idx (i - 1) in + + let l = Task_local_storage.get k_ints in + Task_local_storage.set k_ints @@ (((idx * 1000) + i) :: l); + Fut.return () + ) + +let run ~on idx = Fut.spawn ~on (fun () -> task idx 10) + +let () = + let@ runner = Ws_pool.with_ ~num_threads:4 () in + let tasks = + List.init 8 (fun idx -> + let open Fut.Infix in + let+ () = run ~on:runner idx |> Fut.join in + (* return final value of TLS *) + let l = Task_local_storage.get k_ints in + l) + in + + let res = List.map Fut.wait_block_exn tasks in + List.iteri + (fun i l -> + Printf.printf "res(%d)=[%s]\n" i + (String.concat "," @@ List.map string_of_int l)) + res; + + ()