diff options
Diffstat (limited to 'ocaml-binary-annot/testsuite/tests/lib-threads/test1.ml')
| -rw-r--r-- | ocaml-binary-annot/testsuite/tests/lib-threads/test1.ml | 63 |
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 () + +;; |
