mirror of
https://github.com/c-cube/ocaml-containers.git
synced 2025-12-06 03:05:28 -05:00
64 lines
1.3 KiB
OCaml
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
|