resource sleeping_barber() import SRgetopt var ch : char var num_chairs : int := 5 var num_customers : int := 10 var cut_time : int := 2 var grow_time : int := 4 var run_time : int := 60 # process command line options do (ch := getopt("hs:u:c:g:r:")) != optEOF -> if ch = 'h' -> write("Options:", "-s num_chairs -u num_customers -c cut_time -g grow_time -r run_time") printf("defaults: %10d %16d %11d %12d %11d\n", num_chairs, num_customers, cut_time, grow_time, run_time) stop(1) [] ch = 's' -> num_chairs := int(optarg) [] ch = 'u' -> num_customers := int(optarg) [] ch = 'c' -> cut_time := int(optarg) [] ch = 'g' -> grow_time := int(optarg) [] ch = 'r' -> run_time := int(optarg) [] else -> stop(1) fi od write("sleeping barber alive with") write(" num_chairs=", num_chairs) write(" num_customers=", num_customers) write(" cut_time=", cut_time) write(" grow_time=", grow_time) write(" run_time=", run_time) sem customers := 0 sem barber := 0 sem mutex := 1 sem cutting := 0 var waiting : int := 0 procedure cut_hair() write("age=", age(), "Barber cutting hair") P(cutting) write("age=", age(), "Barber finished cutting") end cut_hair procedure get_haircut(j : int) var napping : int napping := int(random(1000*cut_time)) write("age=", age(), "Customer", j, "haircut for", napping, "ms") nap(napping) write("age=", age(), "Customer", j, "finished haircut") V(cutting) end get_haircut process Barber write("Barber is alive") do true -> write("age=", age(), "Barber waiting for a customer") P(customers) P(mutex) waiting-- V(barber) write("age=", age(), "Barber has customer, waiting=", waiting) V(mutex) cut_hair() od end Barber process Customer(j := 1 to num_customers) var napping : int write("Customer", j, "is alive") do true -> napping := int(random(1000*grow_time)) write("age=", age(), "Customer", j, "growing", napping, "ms") nap(napping) write("age=", age(), "Customer", j, "needs a haircut") P(mutex) if (waiting < num_chairs) -> waiting++ write("age=", age(), "Customer", j, "in room, waiting=", waiting) V(customers) V(mutex) P(barber) get_haircut(j) [] else -> write("age=", age(), "Customer", j, "room full, waiting=", waiting) V(mutex) fi od end Customer nap(1000*run_time); write("must stop now"); stop end sleeping_barber /* ............... Example compile and run(s) % sr -v; sr -o sleeping_barber sleeping_barber.sr SR version 2.3, October 1994 % ./sleeping_barber -h Options: -s num_chairs -u num_customers -c cut_time -g grow_time -r run_time defaults: 5 10 2 4 60 % ./sleeping_barber -s 3 -u 6 -c 2 -g 4 -r 10 sleeping barber alive with num_chairs= 3 num_customers= 6 cut_time= 2 grow_time= 4 run_time= 10 Barber is alive age= 108 Barber waiting for a customer Customer 1 is alive age= 110 Customer 1 growing 3584 ms Customer 2 is alive age= 113 Customer 2 growing 108 ms Customer 3 is alive age= 115 Customer 3 growing 3231 ms Customer 4 is alive age= 117 Customer 4 growing 446 ms Customer 5 is alive age= 119 Customer 5 growing 3634 ms Customer 6 is alive age= 121 Customer 6 growing 2699 ms age= 226 Customer 2 needs a haircut age= 227 Customer 2 in room, waiting= 1 age= 229 Barber has customer, waiting= 0 age= 230 Barber cutting hair age= 232 Customer 2 haircut for 1985 ms age= 566 Customer 4 needs a haircut age= 568 Customer 4 in room, waiting= 1 age= 2226 Customer 2 finished haircut age= 2227 Customer 2 growing 943 ms age= 2229 Barber finished cutting age= 2230 Barber waiting for a customer age= 2231 Barber has customer, waiting= 0 age= 2233 Barber cutting hair age= 2234 Customer 4 haircut for 1496 ms age= 2827 Customer 6 needs a haircut age= 2828 Customer 6 in room, waiting= 1 age= 3176 Customer 2 needs a haircut age= 3177 Customer 2 in room, waiting= 2 age= 3356 Customer 3 needs a haircut age= 3357 Customer 3 in room, waiting= 3 age= 3696 Customer 1 needs a haircut age= 3697 Customer 1 room full, waiting= 3 age= 3699 Customer 1 growing 2582 ms age= 3736 Customer 4 finished haircut age= 3737 Customer 4 growing 1426 ms age= 3739 Barber finished cutting age= 3740 Barber waiting for a customer age= 3741 Barber has customer, waiting= 2 age= 3743 Barber cutting hair age= 3744 Customer 6 haircut for 380 ms age= 3756 Customer 5 needs a haircut age= 3757 Customer 5 in room, waiting= 3 age= 4126 Customer 6 finished haircut age= 4127 Customer 6 growing 2008 ms age= 4129 Barber finished cutting age= 4131 Barber waiting for a customer age= 4132 Barber has customer, waiting= 2 age= 4134 Barber cutting hair age= 4135 Customer 2 haircut for 1955 ms age= 5166 Customer 4 needs a haircut age= 5167 Customer 4 in room, waiting= 3 age= 6096 Customer 2 finished haircut age= 6097 Customer 2 growing 2105 ms age= 6099 Barber finished cutting age= 6101 Barber waiting for a customer age= 6102 Barber has customer, waiting= 2 age= 6103 Barber cutting hair age= 6105 Customer 3 haircut for 274 ms age= 6146 Customer 6 needs a haircut age= 6147 Customer 6 in room, waiting= 3 age= 6286 Customer 1 needs a haircut age= 6287 Customer 1 room full, waiting= 3 age= 6288 Customer 1 growing 1830 ms age= 6386 Customer 3 finished haircut age= 6387 Customer 3 growing 1992 ms age= 6389 Barber finished cutting age= 6390 Barber waiting for a customer age= 6391 Barber has customer, waiting= 2 age= 6393 Barber cutting hair age= 6394 Customer 5 haircut for 278 ms age= 6676 Customer 5 finished haircut age= 6677 Customer 5 growing 935 ms age= 6679 Barber finished cutting age= 6680 Barber waiting for a customer age= 6681 Barber has customer, waiting= 1 age= 6683 Barber cutting hair age= 6684 Customer 4 haircut for 1163 ms age= 7616 Customer 5 needs a haircut age= 7617 Customer 5 in room, waiting= 2 age= 7856 Customer 4 finished haircut age= 7857 Customer 4 growing 1190 ms age= 7859 Barber finished cutting age= 7860 Barber waiting for a customer age= 7862 Barber has customer, waiting= 1 age= 7863 Barber cutting hair age= 7864 Customer 6 haircut for 1292 ms age= 8126 Customer 1 needs a haircut age= 8127 Customer 1 in room, waiting= 2 age= 8206 Customer 2 needs a haircut age= 8207 Customer 2 in room, waiting= 3 age= 8386 Customer 3 needs a haircut age= 8387 Customer 3 room full, waiting= 3 age= 8388 Customer 3 growing 1814 ms age= 9056 Customer 4 needs a haircut age= 9057 Customer 4 room full, waiting= 3 age= 9058 Customer 4 growing 2238 ms age= 9166 Customer 6 finished haircut age= 9167 Customer 6 growing 3672 ms age= 9170 Barber finished cutting age= 9171 Barber waiting for a customer age= 9172 Barber has customer, waiting= 2 age= 9174 Barber cutting hair age= 9175 Customer 5 haircut for 1182 ms must stop now */