resource server op Start_Read(i : int), End_Read(i : int) op Start_Write(i : int), End_Write(i : int) body server() write("readers and writers server is alive") var Readers : int := 0 sem mutex := 1 sem OK := 1 proc Start_Read(i) P(mutex) Readers++ if Readers = 1 -> write("age=", age(), "reader", i, "waiting to read, Readers=", Readers) P(OK) fi write(" age=", age(), "reader", i, "has begun reading, Readers=", Readers) V(mutex) end Start_Read proc End_Read(i) P(mutex) Readers-- write(" age=", age(), "reader", i, "finished reading, Readers=", Readers) if Readers = 0 -> V(OK) fi V(mutex) end End_Read proc Start_Write(i) P(OK) write(" age=", age(), "WRITER", i, "has begun Writing,") end Start_Write proc End_Write(i) write(" age=", age(), "WRITER", i, "has finished Writing") V(OK) end End_Write end server resource reader import server body reader(i : int; scap : cap server; nap_time : int) write("reader", i, "is alive, nap_time =", nap_time) process reading var napping : int do true -> napping := int(random(1000*nap_time)) write("age=", age(), "reader", i, "napping for", napping) nap(napping) write("age=", age(), "reader", i, "wants to read") scap.Start_Read(i) napping := int(random(1000*nap_time)) write("age=", age(), "reader", i, "begins reading for", napping) nap(napping) scap.End_Read(i) write("age=", age(), "reader", i, "finished reading") od end reading end reader resource writer import server body writer(i : int; scap : cap server; nap_time : int) write("WRITER", i, "is alive, nap_time =", nap_time) process writing var napping : int do true -> napping := int(random(1000*nap_time)) write("age=", age(), "WRITER", i, "napping for", napping) nap(napping) write("age=", age(), "WRITER", i, "wants to write") scap.Start_Write(i) napping := int(random(1000*nap_time)) write("age=", age(), "WRITER", i, "is writing for", napping) nap(napping) write("age=", age(), "WRITER", i, "is finished writing") scap.End_Write(i) od end writing end writer resource start() import writer, reader, server var readers : int := 10, writers : int := 5, nap_time : int := 3 var run_time : int := 60 var scap : cap server getarg(1, readers); getarg(2, writers); getarg(3, nap_time) getarg(4, run_time) write(readers, "readers and", writers, "writers starting with nap_time", nap_time, "and run_time", run_time) scap := create server() fa i := 1 to readers -> create reader(i, scap, nap_time) af fa i := 1 to writers -> create writer(i, scap, nap_time) af nap(1000*run_time); write("must stop now"); stop end start /* ............... Example compile and run(s) % sr -o rdwr rdwr.sr % ./rdwr 3 2 1 10 3 readers and 2 writers starting with nap_time 1 and run_time 10 readers and writers server is alive reader 1 is alive, nap_time = 1 age= 223 reader 1 napping for 506 reader 2 is alive, nap_time = 1 age= 233 reader 2 napping for 694 reader 3 is alive, nap_time = 1 age= 509 reader 3 napping for 27 WRITER 1 is alive, nap_time = 1 age= 641 WRITER 1 napping for 338 age= 658 reader 3 wants to read age= 670 reader 3 waiting to read, Readers= 1 age= 727 reader 3 has begun reading, Readers= 1 age= 732 reader 3 begins reading for 60 WRITER 2 is alive, nap_time = 1 age= 738 WRITER 2 napping for 565 age= 743 reader 1 wants to read age= 746 reader 1 has begun reading, Readers= 2 age= 749 reader 1 begins reading for 500 age= 804 reader 3 finished reading, Readers= 1 age= 815 reader 3 finished reading age= 822 reader 3 napping for 712 age= 934 reader 2 wants to read age= 937 reader 2 has begun reading, Readers= 2 age= 942 reader 2 begins reading for 166 age= 995 WRITER 1 wants to write age= 1114 reader 2 finished reading, Readers= 1 age= 1117 reader 2 finished reading age= 1123 reader 2 napping for 514 age= 1255 reader 1 finished reading, Readers= 0 age= 1260 reader 1 finished reading age= 1263 reader 1 napping for 545 age= 1266 WRITER 1 has begun Writing, age= 1269 WRITER 1 is writing for 796 age= 1314 WRITER 2 wants to write age= 1553 reader 3 wants to read age= 1559 reader 3 waiting to read, Readers= 1 age= 1701 reader 2 wants to read age= 1825 reader 1 wants to read age= 2075 WRITER 1 is finished writing age= 2146 WRITER 1 has finished Writing age= 2174 WRITER 1 napping for 555 age= 2193 WRITER 2 has begun Writing, age= 2207 WRITER 2 is writing for 964 age= 2754 WRITER 1 wants to write age= 3212 WRITER 2 is finished writing age= 3218 WRITER 2 has finished Writing age= 3219 WRITER 2 napping for 821 age= 3221 reader 3 has begun reading, Readers= 1 age= 3222 reader 3 begins reading for 471 age= 3223 reader 2 has begun reading, Readers= 2 age= 3225 reader 2 begins reading for 286 age= 3226 reader 1 has begun reading, Readers= 3 age= 3227 reader 1 begins reading for 808 age= 3515 reader 2 finished reading, Readers= 2 age= 3685 reader 2 finished reading age= 3733 reader 2 napping for 739 age= 3784 reader 3 finished reading, Readers= 1 age= 3822 reader 3 finished reading age= 3883 reader 3 napping for 294 age= 4044 reader 1 finished reading, Readers= 0 age= 4050 reader 1 finished reading age= 4053 reader 1 napping for 615 age= 4056 WRITER 2 wants to write age= 4059 WRITER 1 has begun Writing, age= 4062 WRITER 1 is writing for 689 age= 4285 reader 3 wants to read age= 4289 reader 3 waiting to read, Readers= 1 age= 4523 reader 2 wants to read age= 4673 reader 1 wants to read age= 4763 WRITER 1 is finished writing age= 4766 WRITER 1 has finished Writing age= 4768 WRITER 1 napping for 100 age= 4769 WRITER 2 has begun Writing, age= 4770 WRITER 2 is writing for 505 age= 4873 WRITER 1 wants to write age= 5334 WRITER 2 is finished writing age= 5339 WRITER 2 has finished Writing age= 5340 WRITER 2 napping for 704 age= 5341 reader 3 has begun reading, Readers= 1 age= 5343 reader 3 begins reading for 575 age= 5344 reader 2 has begun reading, Readers= 2 age= 5346 reader 2 begins reading for 673 age= 5347 reader 1 has begun reading, Readers= 3 age= 5348 reader 1 begins reading for 941 age= 5923 reader 3 finished reading, Readers= 2 age= 5928 reader 3 finished reading age= 5929 reader 3 napping for 844 age= 6023 reader 2 finished reading, Readers= 1 age= 6026 reader 2 finished reading age= 6028 reader 2 napping for 631 age= 6053 WRITER 2 wants to write age= 6294 reader 1 finished reading, Readers= 0 age= 6298 reader 1 finished reading age= 6299 reader 1 napping for 543 age= 6300 WRITER 1 has begun Writing, age= 6301 WRITER 1 is writing for 650 age= 6664 reader 2 wants to read age= 6678 reader 2 waiting to read, Readers= 1 age= 6783 reader 3 wants to read age= 6935 reader 1 wants to read age= 6953 WRITER 1 is finished writing age= 6956 WRITER 1 has finished Writing age= 6958 WRITER 1 napping for 837 age= 6959 WRITER 2 has begun Writing, age= 6962 WRITER 2 is writing for 12 age= 6986 WRITER 2 is finished writing age= 7000 WRITER 2 has finished Writing age= 7001 WRITER 2 napping for 93 age= 7002 reader 2 has begun reading, Readers= 1 age= 7004 reader 2 begins reading for 337 age= 7005 reader 3 has begun reading, Readers= 2 age= 7007 reader 3 begins reading for 448 age= 7008 reader 1 has begun reading, Readers= 3 age= 7009 reader 1 begins reading for 782 age= 7104 WRITER 2 wants to write age= 7344 reader 2 finished reading, Readers= 2 age= 7358 reader 2 finished reading age= 7360 reader 2 napping for 345 age= 7466 reader 3 finished reading, Readers= 1 age= 7470 reader 3 finished reading age= 7471 reader 3 napping for 662 age= 7733 reader 2 wants to read age= 7751 reader 2 has begun reading, Readers= 2 age= 7753 reader 2 begins reading for 391 age= 7793 reader 1 finished reading, Readers= 1 age= 7797 reader 1 finished reading age= 7798 reader 1 napping for 660 age= 7799 WRITER 1 wants to write age= 8143 reader 3 wants to read age= 8146 reader 3 has begun reading, Readers= 2 age= 8148 reader 3 begins reading for 478 age= 8150 reader 2 finished reading, Readers= 1 age= 8151 reader 2 finished reading age= 8152 reader 2 napping for 790 age= 8467 reader 1 wants to read age= 8470 reader 1 has begun reading, Readers= 2 age= 8472 reader 1 begins reading for 687 age= 8633 reader 3 finished reading, Readers= 1 age= 8636 reader 3 finished reading age= 8637 reader 3 napping for 812 age= 8943 reader 2 wants to read age= 8946 reader 2 has begun reading, Readers= 2 age= 8948 reader 2 begins reading for 458 age= 9163 reader 1 finished reading, Readers= 1 age= 9166 reader 1 finished reading age= 9167 reader 1 napping for 399 age= 9413 reader 2 finished reading, Readers= 0 age= 9416 reader 2 finished reading age= 9417 reader 2 napping for 884 age= 9419 WRITER 2 has begun Writing, age= 9420 WRITER 2 is writing for 737 age= 9453 reader 3 wants to read age= 9456 reader 3 waiting to read, Readers= 1 age= 9573 reader 1 wants to read age= 10163 WRITER 2 is finished writing age= 10166 WRITER 2 has finished Writing age= 10168 WRITER 2 napping for 43 age= 10169 WRITER 1 has begun Writing, age= 10170 WRITER 1 is writing for 799 age= 10213 WRITER 2 wants to write age= 10303 reader 2 wants to read must stop now */