resource reader import Reader_Writer body reader(i : int; 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") Reader_Writer.Start_Read(i) napping := int(random(1000*nap_time)) write("age=", age(), "reader", i, "begins reading for", napping) nap(napping) Reader_Writer.End_Read(i) write("age=", age(), "reader", i, "finished reading") od end reading end reader resource writer import Reader_Writer body writer(i : int; 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") Reader_Writer.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") Reader_Writer.End_Write(i) od end writing end writer resource start() import writer, reader, Reader_Writer var readers : int := 10, writers : int := 5, nap_time : int := 3 var run_time : int := 60 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) fa i := 1 to readers -> create reader(i, nap_time) af fa i := 1 to writers -> create writer(i, nap_time) af nap(1000*run_time); write("must stop now"); stop end start /* ............... Example compile and run(s) % m2sr -sx rw.m % sr -o rw rw.sr driver.sr rw.sr: driver.sr: rw.sr: driver.sr: linking: % rw 5 2 1 10 5 readers and 2 writers starting with nap_time 1 and run_time 10 reader 1 is alive, nap_time = 1 age= 64 reader 1 napping for 585 reader 2 is alive, nap_time = 1 age= 80 reader 2 napping for 44 reader 3 is alive, nap_time = 1 age= 106 reader 3 napping for 682 reader 4 is alive, nap_time = 1 age= 137 reader 4 napping for 406 age= 166 reader 2 wants to read reader 5 is alive, nap_time = 1 age= 174 reader 5 napping for 970 age= 184 reader 2 has begun reading, Readers= 1 WRITER 1 is alive, nap_time = 1 age= 193 WRITER 1 napping for 809 age= 235 reader 2 begins reading for 124 WRITER 2 is alive, nap_time = 1 age= 248 WRITER 2 napping for 320 age= 370 reader 2 finished reading, Readers= 0 age= 374 reader 2 finished reading age= 382 reader 2 napping for 844 age= 552 reader 4 wants to read age= 557 reader 4 has begun reading, Readers= 1 age= 566 reader 4 begins reading for 12 age= 579 WRITER 2 wants to write age= 586 reader 4 finished reading, Readers= 0 age= 604 reader 4 finished reading age= 608 reader 4 napping for 861 age= 611 WRITER 2 has begun Writing, age= 614 WRITER 2 is writing for 409 age= 659 reader 1 wants to read age= 800 reader 3 wants to read age= 1019 WRITER 1 wants to write age= 1031 WRITER 2 is finished writing age= 1035 WRITER 2 has finished Writing age= 1046 WRITER 2 napping for 498 age= 1049 reader 1 has begun reading, Readers= 1 age= 1056 reader 1 begins reading for 191 age= 1068 reader 3 has begun reading, Readers= 2 age= 1078 reader 3 begins reading for 514 age= 1151 reader 5 wants to read age= 1171 reader 5 has to WAIT age= 1240 reader 2 wants to read age= 1245 reader 2 has to WAIT age= 1261 reader 1 finished reading, Readers= 1 age= 1279 reader 1 finished reading age= 1285 reader 1 napping for 520 age= 1479 reader 4 wants to read age= 1489 reader 4 has to WAIT age= 1549 WRITER 2 wants to write age= 1607 reader 3 finished reading, Readers= 0 age= 1612 reader 3 finished reading age= 1615 reader 3 napping for 766 age= 1620 WRITER 1 has begun Writing, age= 1628 WRITER 1 is writing for 774 age= 1809 reader 1 wants to read age= 2389 reader 3 wants to read age= 2425 WRITER 1 is finished writing age= 2430 WRITER 1 has finished Writing age= 2435 WRITER 1 napping for 582 age= 2438 reader 5 has begun reading, Readers= 1 age= 2443 reader 5 begins reading for 629 age= 2459 reader 2 has begun reading, Readers= 2 age= 2464 reader 2 begins reading for 717 age= 2468 reader 4 has begun reading, Readers= 3 age= 2474 reader 4 begins reading for 565 age= 2477 reader 1 has begun reading, Readers= 4 age= 2492 reader 1 begins reading for 499 age= 2497 reader 3 has begun reading, Readers= 5 age= 2506 reader 3 begins reading for 933 age= 3004 reader 1 finished reading, Readers= 4 ... must stop now */