summaryrefslogtreecommitdiff
path: root/testsuite/tests/lib-threads/test7.ml
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/tests/lib-threads/test7.ml')
-rw-r--r--testsuite/tests/lib-threads/test7.ml26
1 files changed, 26 insertions, 0 deletions
diff --git a/testsuite/tests/lib-threads/test7.ml b/testsuite/tests/lib-threads/test7.ml
new file mode 100644
index 0000000000..0ac3474287
--- /dev/null
+++ b/testsuite/tests/lib-threads/test7.ml
@@ -0,0 +1,26 @@
+open Event
+
+let add_ch = new_channel()
+let sub_ch = new_channel()
+let read_ch = new_channel()
+
+let rec accu n =
+ select [
+ wrap (receive add_ch) (fun x -> accu (n+x));
+ wrap (receive sub_ch) (fun x -> accu (n-x));
+ wrap (send read_ch n) (fun () -> accu n)
+ ]
+
+let rec sender chan value =
+ sync(send chan value); sender chan value
+
+let read () =
+ print_int(sync(receive read_ch)); print_newline()
+
+let main () =
+ Thread.create accu 0;
+ Thread.create (sender add_ch) 1;
+ Thread.create (sender sub_ch) 1;
+ while true do read() done
+
+let _ = Printexc.catch main ()