global Types optype msg(real) end Types global Bag import Types; op bag : msg end Bag resource Producer import Types body Producer(id : int; cbag : cap msg; nap_time : int) write("Producer", id, "alive, nap_time=", nap_time) process produce var mess : real, napping : int do true -> napping := int(random(1000*nap_time)) write("age", age(), "Producer", id, "napping", napping, "ms") nap(napping) mess := random() write("age", age(), "Producer", id, "sending", mess) send cbag(mess) od end produce end Producer resource Consumer import Types body Consumer(id : int; cbag : cap msg; nap_time : int) write("Consumer", id, "alive, nap_time=", nap_time) process consume var mess : real, napping : int do true -> receive cbag(mess) write(" ", "age", age(), "Consumer", id, "received", mess) napping := int(random(1000*nap_time)) write(" ", "age", age(), "Consumer", id, "napping", napping, "ms") nap(napping) od end consume end Consumer resource Main() import Types, Bag, Producer, Consumer var num_prods := 2, num_cons := 3, prods_nap := 4, cons_nap := 6 var run_time := 60 getarg(1, num_prods); getarg(2, num_cons); getarg(3, prods_nap); getarg(4, cons_nap); getarg(5, run_time) write("Main alive, num_prods=", num_prods, "num_cons=", num_cons, "prods_nap=", prods_nap, "cons_nap=", cons_nap, "run_time=", run_time) fa id := 1 to num_prods -> create Producer(id, Bag.bag, prods_nap) af fa id := 1 to num_cons -> create Consumer(id, Bag.bag, cons_nap) af nap(run_time*1000); write("must stop now"); stop end Main /* ............... Example compile and run(s) % sr -v; sr -o bag_of_tasks bag_of_tasks.sr SR version 2.3, October 1994 % ./bag_of_tasks 3 2 3 2 7 Main alive, num_prods= 3 num_cons= 2 prods_nap= 3 cons_nap= 2 run_time= 7 Producer 1 alive, nap_time= 3 age 47 Producer 1 napping 2058 ms Producer 2 alive, nap_time= 3 age 64 Producer 2 napping 1306 ms Producer 3 alive, nap_time= 3 age 76 Producer 3 napping 1999 ms Consumer 1 alive, nap_time= 2 Consumer 2 alive, nap_time= 2 age 1376 Producer 2 sending 0.398569 age 1385 Producer 2 napping 2445 ms age 1389 Consumer 1 received 0.398569 age 1391 Consumer 1 napping 508 ms age 2086 Producer 3 sending 0.859487 age 2088 Producer 3 napping 225 ms age 2091 Consumer 2 received 0.859487 age 2092 Consumer 2 napping 1929 ms age 2116 Producer 1 sending 0.807917 age 2118 Producer 1 napping 702 ms age 2120 Consumer 1 received 0.807917 age 2122 Consumer 1 napping 1307 ms age 2316 Producer 3 sending 0.170818 age 2318 Producer 3 napping 1134 ms age 2826 Producer 1 sending 0.694144 age 2828 Producer 1 napping 346 ms age 3176 Producer 1 sending 0.590441 age 3178 Producer 1 napping 1982 ms age 3436 Consumer 1 received 0.170818 age 3438 Consumer 1 napping 1469 ms age 3456 Producer 3 sending 0.274936 age 3458 Producer 3 napping 2195 ms age 3836 Producer 2 sending 0.260724 age 3838 Producer 2 napping 2680 ms age 4027 Consumer 2 received 0.694144 age 4030 Consumer 2 napping 528 ms age 4566 Consumer 2 received 0.590441 age 4568 Consumer 2 napping 78 ms age 4656 Consumer 2 received 0.274936 age 4659 Consumer 2 napping 441 ms age 4916 Consumer 1 received 0.260724 age 4919 Consumer 1 napping 1284 ms age 5166 Producer 1 sending 0.264423 age 5168 Producer 1 napping 305 ms age 5170 Consumer 2 received 0.264423 age 5172 Consumer 2 napping 1448 ms age 5476 Producer 1 sending 0.390342 age 5478 Producer 1 napping 2539 ms age 5656 Producer 3 sending 0.316111 age 5658 Producer 3 napping 2178 ms age 6206 Consumer 1 received 0.390342 age 6209 Consumer 1 napping 162 ms age 6376 Consumer 1 received 0.316111 age 6378 Consumer 1 napping 278 ms age 6526 Producer 2 sending 0.513220 age 6528 Producer 2 napping 1261 ms age 6626 Consumer 2 received 0.513220 age 6629 Consumer 2 napping 1031 ms must stop now */