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