resource philosopher import dining_interface body philosopher(i : int; dcap : cap dining_interface; thinking, eating: int) write("philosopher", i, "alive, max think eat delays", thinking, eating) procedure think() var napping : int napping := int(random(1000*thinking)) writes("age=",age(),", philosopher ",i," thinking for ",napping," ms\n") nap(napping) end think procedure eat() var napping : int napping := int(random(1000*eating)) writes("age=",age(),", philosopher ",i," eating for ",napping," ms\n") nap(napping) end eat process phil do true -> think() writes("age=", age(), ", philosopher ", i, " is hungry\n") dcap.take_forks(i) writes("age=", age(), ", philosopher ", i, " has taken forks\n") eat() dcap.put_forks(i) writes("age=", age(), ", philosopher ", i, " has returned forks\n") od end phil end philosopher resource dining_interface import dining_server op take_forks(i : int), put_forks(i : int) body dining_interface(check_very_hungry : bool) write("dining_interface alive, check_very_hungry is", check_very_hungry) proc take_forks(i) dining_server.hungry_and_get_forks(i) end take_forks proc put_forks(i) dining_server.finished_eating(i) dining_server.check_left_fork_down(i, check_very_hungry) dining_server.check_right_fork_down(i, check_very_hungry) end put_forks end dining_interface resource driver() import philosopher, dining_interface var check_very_hungry : bool := true var num_phils : int := 5, run_time : int := 60 getarg(1, check_very_hungry); getarg(2, num_phils); getarg(3, run_time) var max_think_delay[1:num_phils] : int := ([num_phils] 5) var max_eat_delay[1:num_phils] : int := ([num_phils] 2) fa i := 1 to num_phils -> getarg(2*i+2, max_think_delay[i]); getarg(2*i+3, max_eat_delay[i]) af var dcap : cap dining_interface write(num_phils, "dining philosophers running", run_time, "seconds") dcap := create dining_interface(check_very_hungry) fa i := 1 to num_phils -> create philosopher(i, dcap, max_think_delay[i], max_eat_delay[i]) af nap(1000*run_time); write("must stop now"); stop end driver /* ............... Example compile and run(s) % m2sr -sx dp.m % sr -o dp dp.sr dp_driver.sr dp.sr: dp_driver.sr: dp.sr: dp_driver.sr: linking: % ./dp false 5 30 300 1 1 20 2 2 1 20 300 1 5 dining philosophers running 30 seconds dining_interface alive, check_very_hungry is false philosopher 1 alive, max think eat delays 300 1 age=75, philosopher 1 thinking for 284352 ms philosopher 2 alive, max think eat delays 1 20 age=91, philosopher 2 thinking for 601 ms philosopher 3 alive, max think eat delays 2 2 age=108, philosopher 3 thinking for 1415 ms philosopher 4 alive, max think eat delays 1 20 age=125, philosopher 4 thinking for 483 ms philosopher 5 alive, max think eat delays 300 1 age=141, philosopher 5 thinking for 29612 ms age=619, philosopher 4 is hungry *** at age 625 philosopher 4 may eat age=629, philosopher 4 has taken forks age=631, philosopher 4 eating for 18399 ms age=700, philosopher 2 is hungry *** at age 710 philosopher 2 may eat age=714, philosopher 2 has taken forks age=717, philosopher 2 eating for 16128 ms age=1529, philosopher 3 is hungry age=16852, philosopher 2 has returned forks age=16856, philosopher 2 thinking for 537 ms age=17399, philosopher 2 is hungry *** at age 17403 philosopher 2 may eat age=17404, philosopher 2 has taken forks age=17405, philosopher 2 eating for 12056 ms age=19042, philosopher 4 has returned forks age=19046, philosopher 4 thinking for 635 ms age=19689, philosopher 4 is hungry *** at age 19693 philosopher 4 may eat age=19694, philosopher 4 has taken forks age=19695, philosopher 4 eating for 7916 ms age=27621, philosopher 4 has returned forks age=27625, philosopher 4 thinking for 25 ms age=27659, philosopher 4 is hungry *** at age 27663 philosopher 4 may eat age=27664, philosopher 4 has taken forks age=27666, philosopher 4 eating for 11719 ms age=29471, philosopher 2 has returned forks age=29475, philosopher 2 thinking for 295 ms age=29759, philosopher 5 is hungry age=29780, philosopher 2 is hungry *** at age 29788 philosopher 2 may eat age=29789, philosopher 2 has taken forks age=29798, philosopher 2 eating for 19603 ms must stop now % ./dp true 5 30 300 1 1 20 2 2 1 20 300 1 5 dining philosophers running 30 seconds dining_interface alive, check_very_hungry is true philosopher 1 alive, max think eat delays 300 1 age=110, philosopher 1 thinking for 178842 ms philosopher 2 alive, max think eat delays 1 20 age=123, philosopher 2 thinking for 859 ms philosopher 3 alive, max think eat delays 2 2 age=136, philosopher 3 thinking for 483 ms philosopher 4 alive, max think eat delays 1 20 age=150, philosopher 4 thinking for 292 ms philosopher 5 alive, max think eat delays 300 1 age=163, philosopher 5 thinking for 263276 ms age=445, philosopher 4 is hungry *** at age 519 philosopher 4 may eat age=523, philosopher 4 has taken forks age=526, philosopher 4 eating for 9251 ms age=626, philosopher 3 is hungry age=986, philosopher 2 is hungry *** at age 1259 philosopher 2 may eat age=1417, philosopher 2 has taken forks age=1606, philosopher 2 eating for 4476 ms *** at age 6100 philosopher 3 is VERY HUNGRY age=6105, philosopher 2 has returned forks age=6106, philosopher 2 thinking for 591 ms age=6706, philosopher 2 is hungry *** at age 9786 philosopher 3 may eat age=9792, philosopher 4 has returned forks age=9793, philosopher 4 thinking for 714 ms age=9795, philosopher 3 has taken forks age=9796, philosopher 3 eating for 234 ms *** at age 10036 philosopher 2 may eat age=10041, philosopher 3 has returned forks age=10042, philosopher 3 thinking for 1188 ms age=10044, philosopher 2 has taken forks age=10046, philosopher 2 eating for 3601 ms age=10515, philosopher 4 is hungry *** at age 10519 philosopher 4 may eat age=10521, philosopher 4 has taken forks age=10522, philosopher 4 eating for 6002 ms age=11235, philosopher 3 is hungry *** at age 13657 philosopher 3 is VERY HUNGRY age=13661, philosopher 2 has returned forks age=13662, philosopher 2 thinking for 250 ms age=13915, philosopher 2 is hungry *** at age 16527 philosopher 3 may eat age=16532, philosopher 4 has returned forks age=16534, philosopher 4 thinking for 473 ms age=16535, philosopher 3 has taken forks age=16536, philosopher 3 eating for 60 ms *** at age 16606 philosopher 2 may eat age=16618, philosopher 3 has returned forks age=16623, philosopher 3 thinking for 93 ms age=16625, philosopher 2 has taken forks age=16626, philosopher 2 eating for 11215 ms age=16725, philosopher 3 is hungry age=17015, philosopher 4 is hungry *** at age 17019 philosopher 4 may eat age=17020, philosopher 4 has taken forks age=17021, philosopher 4 eating for 15353 ms *** at age 27847 philosopher 3 is VERY HUNGRY age=27851, philosopher 2 has returned forks age=27852, philosopher 2 thinking for 251 ms age=28105, philosopher 2 is hungry must stop now */