-- Modified from John Barnes, "Programming in Ada 95". -- Readers/Writers synchronization with tracing and artificial delays. with text_io; package body readerwriter is use text_io; package int_io is new integer_io(integer); use int_io; V : integer; -- V is the data Test : Boolean := True; task Control is entry Start; entry Stop; entry Write(X: in integer; N: in Count); end; task body Control is Readers: Integer := 0; -- number of active readers begin accept Write(X: in integer; N: in Count) do -- Write initial value of V; if Test then Set_Col(N); Put("Start Write "); Put(X,2); New_Line; end if; V := X; if Test then delay 0.05; Set_Col(N); Put("End write "); Put(X,2); New_Line; end if; 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; N: in Count) do if Test then Set_Col(N); Put("Start Write "); Put(X,2); New_Line; end if; V := X; if Test then delay 0.05; Set_Col(N); Put("End Write "); Put(X,2); New_Line; end if; end Write; end select; end loop; end Control; procedure Read(X: out Integer; N: in Count) is begin Control.Start; X := V; if Test then Set_Col(N); Put("Start Read "); Put(X,2); New_Line; end if; if Test then delay 0.04; Set_Col(N); Put("End Read "); Put(X,2); New_Line; end if; Control.Stop; end Read; procedure Write(X: in Integer; N: in Count) is begin Control.Write(X,N); end Write; end readerwriter;