|
1 | 1 | open Lwt.Syntax
|
2 | 2 |
|
3 |
| -let pmain, wmain = Lwt.wait () |
4 |
| -let palt, walt = Lwt.wait () |
| 3 | +let p_one, w_one = Lwt.wait () |
| 4 | +let p_two, w_two = Lwt.wait () |
5 | 5 |
|
6 |
| -let dalt = Domain.spawn (fun () -> |
| 6 | +let d_one = Domain.spawn (fun () -> |
| 7 | + (* domain one: wait for value from domain two then work and then send a value *) |
| 8 | + Lwt_main.run ( |
| 9 | + let* v_two = p_two in |
| 10 | + Printf.printf "one received %d from two\n" v_two; |
| 11 | + flush_all (); |
| 12 | + let* () = Lwt_unix.sleep 0.1 in |
| 13 | + Printf.printf "one slept\n"; |
| 14 | + flush_all (); |
| 15 | + let v_one = 3 in |
| 16 | + Lwt.wakeup w_one v_one; |
| 17 | + Printf.printf "one sent %d\n" v_one; |
| 18 | + flush_all (); |
| 19 | + let* v_two = p_two and* v_one = p_one in |
| 20 | + Lwt.return (v_two * v_one) |
| 21 | + ) |
| 22 | +) |
| 23 | +let d_two = Domain.spawn (fun () -> |
7 | 24 | Lwt_main.run (
|
8 | 25 | let () =
|
9 |
| - (* concurrent thread within alt domain *) |
| 26 | + (* concurrent thread within domain "two" send a value and then work and |
| 27 | + then wait for a value from domain one *) |
10 | 28 | Lwt.dont_wait (fun () ->
|
11 | 29 | let* () = Lwt_unix.sleep 0.1 in
|
12 |
| - Printf.printf "alt slept\n"; |
| 30 | + Printf.printf "two slept\n"; |
13 | 31 | flush_all ();
|
14 |
| - let valt = 2 in |
15 |
| - Lwt.wakeup walt valt; |
16 |
| - Printf.printf "alt sent %d\n" valt; |
| 32 | + let v_two = 2 in |
| 33 | + Lwt.wakeup w_two v_two; |
| 34 | + Printf.printf "two sent %d\n" v_two; |
17 | 35 | flush_all ();
|
18 |
| - let* from_main = pmain in |
19 |
| - Printf.printf "alt received %d from main\n" from_main; |
| 36 | + let* from_one = p_one in |
| 37 | + Printf.printf "two received %d from one\n" from_one; |
20 | 38 | flush_all ();
|
21 | 39 | Lwt.return ()
|
22 | 40 | )
|
23 | 41 | (fun _ -> exit 1)
|
24 | 42 | in
|
25 |
| - let* valt = palt and* vmain = pmain in |
26 |
| - Lwt.return (valt + vmain) |
| 43 | + let* v_two = p_two and* v_one = p_one in |
| 44 | + Lwt.return (v_two + v_one) |
27 | 45 | )
|
28 | 46 | )
|
29 | 47 |
|
30 |
| -let main = |
31 |
| - Lwt_main.run ( |
32 |
| - let* valt = palt in |
33 |
| - Printf.printf "main received %d from alt\n" valt; |
34 |
| - flush_all (); |
35 |
| - let* () = Lwt_unix.sleep 0.1 in |
36 |
| - Printf.printf "main slept\n"; |
37 |
| - flush_all (); |
38 |
| - let vmain = 3 in |
39 |
| - Lwt.wakeup wmain vmain; |
40 |
| - Printf.printf "main sent %d\n" vmain; |
41 |
| - flush_all (); |
42 |
| - let* valt = palt and* vmain = pmain in |
43 |
| - Lwt.return (valt * vmain) |
44 |
| - ) |
45 | 48 |
|
46 |
| -let alt = Domain.join dalt |
| 49 | +let one = Domain.join d_one |
| 50 | +let two = Domain.join d_two |
47 | 51 |
|
48 |
| -let () = Printf.printf "alt: %d, main: %d\n" alt main |
| 52 | +let () = Printf.printf "one: %d, two: %d\n" one two |
49 | 53 | let () = flush_all ()
|
0 commit comments