-- From John Barnes, "Programming in Ada 95". package body rw is V : integer; -- V is the data task Control is entry Start; entry Stop; entry Write(X: in integer); end; task body Control is Readers: Integer := 0; -- number of active readers begin accept Write(X: in integer) do -- Write initial value of V; V := X; end Write; loop select accept Start do Readers := Readers + 1; end Start; or accept Stop do Readers := Readers - 1; end Stop; or when Readers = 0 => accept Write(X: in integer) do V := X; end Write; end select; end loop; end Control; procedure Read(X: out Integer) is begin Control.Start; X := V; Control.Stop; end Read; procedure Write(X: in Integer) is begin Control.Write(X); end Write; end rw;