resource server optype serve = (client_id, want_done, service_time: int) returns value : real op service : serve body server() write("server is alive") op do_service : serve process serving do true -> in service(client_id, want_done, service_time) returns value -> if want_done = 1 or want_done = 3 -> write("age=", age(), "service", want_done, "forwarded for client", client_id, "for", service_time, "ms") forward do_service(client_id, want_done, service_time) [] want_done = 2 -> write("age=", age(), "service", want_done, "starting for client", client_id, "for", service_time, "ms") value := do_service(client_id, want_done, service_time) [] else -> write("age=", age(), "service", want_done, "not implemented, client=", client_id) value := -1 fi ni od end serving proc do_service(client_id, want_done, service_time) returns value nap(service_time) value := random()*want_done write("age=", age(), "service", want_done, "completed for client", client_id, "value=", value) end do_service end server resource client import server body client(client_id : int; server_cap : cap server; num_services : int; max_nap_time, max_service_time : int) write("client", client_id, "is alive, num_services=", num_services, "max_nap_time=", max_nap_time, "max_service_time=", max_service_time) process go var napping, service_time, want_done : int var value : real do true -> napping:=int(random(1000*max_nap_time)) write("age=", age(), "client", client_id, "napping for", napping, "ms") nap(napping) service_time := int(random(1000*max_service_time)) want_done := int(random(num_services)) + 1 write("age=", age(), "client", client_id, "wants service", want_done, "for", service_time, "ms") value := server_cap.service(client_id, want_done, service_time) write("age=", age(), "client", client_id, "value returned=", value) od end go end client resource client_server() import server, client var server_cap : cap server var num_clients : int := 20, num_services : int := 5 var max_nap_time : int := 10, max_service_time : int := 3 var run_time : int := 60 getarg(1, num_clients); getarg(2, num_services) getarg(3, max_nap_time); getarg(4, max_service_time) getarg(5, run_time) server_cap := create server() write(num_clients, "clients and", num_services, "services starting with max nap time of", max_nap_time, "and max service time of", max_service_time) fa i := 1 to num_clients -> create client(i, server_cap, num_services, max_nap_time, max_service_time) af nap(1000*run_time); write("must stop now"); stop end client_server /* ............... Example compile and run(s) % sr -o client_server client_server.sr % ./client_server 10 5 5 3 5 server is alive 10 clients and 5 services starting with max nap time of 5 and max service time of 3 client 1 is alive, num_services= 5 max_nap_time= 5 max_service_time= 3 age= 29 client 1 napping for 3463 ms client 2 is alive, num_services= 5 max_nap_time= 5 max_service_time= 3 age= 407 client 2 napping for 3935 ms client 3 is alive, num_services= 5 max_nap_time= 5 max_service_time= 3 age= 477 client 3 napping for 3864 ms client 4 is alive, num_services= 5 max_nap_time= 5 max_service_time= 3 age= 493 client 4 napping for 1062 ms client 5 is alive, num_services= 5 max_nap_time= 5 max_service_time= 3 age= 506 client 5 napping for 4224 ms client 6 is alive, num_services= 5 max_nap_time= 5 max_service_time= 3 age= 521 client 6 napping for 468 ms client 7 is alive, num_services= 5 max_nap_time= 5 max_service_time= 3 age= 538 client 7 napping for 1924 ms client 8 is alive, num_services= 5 max_nap_time= 5 max_service_time= 3 age= 552 client 8 napping for 3574 ms client 9 is alive, num_services= 5 max_nap_time= 5 max_service_time= 3 age= 575 client 9 napping for 3217 ms client 10 is alive, num_services= 5 max_nap_time= 5 max_service_time= 3 age= 588 client 10 napping for 773 ms age= 1000 client 6 wants service 3 for 1672 ms age= 1005 service 3 forwarded for client 6 for 1672 ms age= 1370 client 10 wants service 5 for 891 ms age= 1374 service 5 not implemented, client= 10 age= 1377 client 10 value returned= -1.00000 age= 1384 client 10 napping for 517 ms age= 1561 client 4 wants service 3 for 1889 ms age= 1565 service 3 forwarded for client 4 for 1889 ms age= 1910 client 10 wants service 4 for 2320 ms age= 1915 service 4 not implemented, client= 10 age= 1918 client 10 value returned= -1.00000 age= 1921 client 10 napping for 3203 ms age= 2470 client 7 wants service 3 for 157 ms age= 2475 service 3 forwarded for client 7 for 157 ms age= 2652 service 3 completed for client 7 value= 1.25272 age= 2658 client 7 value returned= 1.25272 age= 2662 client 7 napping for 1076 ms age= 2690 service 3 completed for client 6 value= 1.01472 age= 2695 client 6 value returned= 1.01472 age= 2698 client 6 napping for 3029 ms age= 3471 service 3 completed for client 4 value= 1.68025 age= 3476 client 4 value returned= 1.68025 age= 3478 client 4 napping for 436 ms age= 3711 client 1 wants service 3 for 2273 ms age= 3715 service 3 forwarded for client 1 for 2273 ms age= 3751 client 7 wants service 3 for 518 ms age= 3754 service 3 forwarded for client 7 for 518 ms age= 3800 client 9 wants service 1 for 2632 ms age= 3804 service 1 forwarded for client 9 for 2632 ms age= 3920 client 4 wants service 3 for 12 ms age= 3924 service 3 forwarded for client 4 for 12 ms age= 3970 service 3 completed for client 4 value= 0.484111 age= 4063 client 4 value returned= 0.484111 age= 4067 client 4 napping for 4859 ms age= 4130 client 8 wants service 2 for 2637 ms age= 4134 service 2 starting for client 8 for 2637 ms age= 4280 service 3 completed for client 7 value= 0.390791 age= 4285 client 7 value returned= 0.390791 age= 4287 client 7 napping for 721 ms age= 4350 client 3 wants service 1 for 1175 ms age= 4400 client 2 wants service 3 for 2469 ms age= 4740 client 5 wants service 3 for 1235 ms age= 5033 client 7 wants service 3 for 176 ms age= 5130 client 10 wants service 1 for 1881 ms must stop now */