summaryrefslogtreecommitdiff
path: root/ocaml-binary-annot/testsuite/tests/lib-threads/test1.ml
diff options
context:
space:
mode:
Diffstat (limited to 'ocaml-binary-annot/testsuite/tests/lib-threads/test1.ml')
-rw-r--r--ocaml-binary-annot/testsuite/tests/lib-threads/test1.ml63
1 files changed, 63 insertions, 0 deletions
diff --git a/ocaml-binary-annot/testsuite/tests/lib-threads/test1.ml b/ocaml-binary-annot/testsuite/tests/lib-threads/test1.ml
new file mode 100644
index 0000000000..66c402400f
--- /dev/null
+++ b/ocaml-binary-annot/testsuite/tests/lib-threads/test1.ml
@@ -0,0 +1,63 @@
+(* Classic producer-consumer *)
+
+type 'a prodcons =
+ { buffer: 'a array;
+ lock: Mutex.t;
+ mutable readpos: int;
+ mutable writepos: int;
+ notempty: Condition.t;
+ notfull: Condition.t }
+
+let create size init =
+ { buffer = Array.create size init;
+ lock = Mutex.create();
+ readpos = 0;
+ writepos = 0;
+ notempty = Condition.create();
+ notfull = Condition.create() }
+
+let output_lock = Mutex.create()
+
+let put p data =
+ Mutex.lock p.lock;
+ while (p.writepos + 1) mod Array.length p.buffer = p.readpos do
+ Condition.wait p.notfull p.lock
+ done;
+ p.buffer.(p.writepos) <- data;
+ p.writepos <- (p.writepos + 1) mod Array.length p.buffer;
+ Condition.signal p.notempty;
+ Mutex.unlock p.lock
+
+let get p =
+ Mutex.lock p.lock;
+ while p.writepos = p.readpos do
+ Condition.wait p.notempty p.lock
+ done;
+ let data = p.buffer.(p.readpos) in
+ p.readpos <- (p.readpos + 1) mod Array.length p.buffer;
+ Condition.signal p.notfull;
+ Mutex.unlock p.lock;
+ data
+
+(* Test *)
+
+let buff = create 20 0
+
+let rec produce n =
+ Mutex.lock output_lock;
+ print_int n; print_string "-->"; print_newline();
+ Mutex.unlock output_lock;
+ put buff n;
+ if n < 10000 then produce (n+1)
+
+let rec consume () =
+ let n = get buff in
+ Mutex.lock output_lock;
+ print_string "-->"; print_int n; print_newline();
+ Mutex.unlock output_lock;
+ if n < 10000 then consume ()
+
+let t1 = Thread.create produce 0
+let _ = consume ()
+
+;;