mirror of
https://github.com/c-cube/ocaml-containers.git
synced 2025-12-10 13:13:56 -05:00
47 lines
1.3 KiB
OCaml
47 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
|