ocaml-containers/tests/thread/t_bq.ml
Simon Cruanes 10865eaced reformat
2022-07-04 13:36:06 -04:00

64 lines
1.3 KiB
OCaml

module Test = (val Containers_testlib.make ~__FILE__ ())
open Test
open CCBlockingQueue;;
t @@ fun () ->
let q = create 1 in
let t1 =
CCThread.spawn (fun () ->
push q 1;
push q 2)
in
let t2 =
CCThread.spawn (fun () ->
push q 3;
push q 4)
in
let l = CCLock.create [] in
let t3 =
CCThread.spawn (fun () ->
for _i = 1 to 4 do
let x = take q in
CCLock.update l (fun l -> x :: l)
done)
in
Thread.join t1;
Thread.join t2;
Thread.join t3;
assert_equal [ 1; 2; 3; 4 ] (List.sort Stdlib.compare (CCLock.get l));
true
;;
t @@ fun () ->
let n = 1000 in
let lists =
[|
CCList.(1 -- n); CCList.(n + 1 -- (2 * n)); CCList.((2 * n) + 1 -- (3 * n));
|]
in
let q = create 2 in
let senders =
CCThread.Arr.spawn 3 (fun i ->
if i = 1 then
push_list q lists.(i)
(* test push_list *)
else
List.iter (push q) lists.(i))
in
let res = CCLock.create [] in
let receivers =
CCThread.Arr.spawn 3 (fun i ->
if i = 1 then (
let l = take_list q n in
CCLock.update res (fun acc -> l @ acc)
) else
for _j = 1 to n do
let x = take q in
CCLock.update res (fun acc -> x :: acc)
done)
in
CCThread.Arr.join senders;
CCThread.Arr.join receivers;
let l = CCLock.get res |> List.sort Stdlib.compare in
assert_equal CCList.(1 -- (3 * n)) l;
true