package rw21 is procedure readWork; procedure writeWork; task Reader_1 is end Reader_1; task Reader_2 is end Reader_2; task Writer_1 is end Writer_1; task Read_Write_Control is entry Start_Read; entry Stop_Read; entry Start_Write; entry Stop_Write; end Read_Write_Control; end rw21; package body rw21 is procedure readWork is begin delay 1.0; end readWork; procedure writeWork is begin delay 1.0; end writeWork; task body Reader_1 is begin -- Reader_1 loop Read_Write_Control.Start_Read; readWork; Read_Write_Control.Stop_Read; end loop; end Reader_1; task body Reader_2 is begin -- Reader_2 loop Read_Write_Control.Start_Rea readWork; Read_Write_Control.Stop_Read; end loop; end Reader_2; task body Writer_1 is begin loop Read_Write_Control.Start_Write; writeWork; Read_Write_Control.Stop_Write; end loop; end Writer_1; task body Read_Write_Control is ActiveReaders : Natural range 0..2; WriterPresent : BOOLEAN := FALSE; ErrorFlag : BOOLEAN := FALSE; begin -- force a write first accept Start_Write; accept Stop_Write; loop select when not WriterPresent => accept Start_Read; ActiveReaders := ActiveReaders+1; or accept Stop_Read; if WriterPresent and (ActiveReaders = 1 or ActiveReaders = 2) then ErrorFlag := TRUE; end if; ActiveReaders := ActiveReaders-1; or when ActiveReaders = 0 and not WriterPresent => accept Start_Write; WriterPresent := TRUE; or accept Stop_Write; if WriterPresent and (ActiveReaders = 1 or ActiveReaders = 2) then ErrorFlag := True; end if; WriterPresent := FALSE; end select; end loop; end Read_Write_Control; end rw21;