s-tposen.adb (Service_Entry): The object must be always unlocked at the end of this procedure now that the...

2004-10-04  Jose Ruiz  <ruiz@act-europe.fr>

	* s-tposen.adb (Service_Entry): The object must be always unlocked at
	the end of this procedure now that the unlock operation was inserted
	by the expander.

From-SVN: r88489
This commit is contained in:
Jose Ruiz 2004-10-04 16:51:59 +02:00 committed by Arnaud Charlet
parent b23e28d55e
commit 3b37ffbf15
2 changed files with 41 additions and 30 deletions

View file

@ -1,3 +1,9 @@
2004-10-04 Jose Ruiz <ruiz@act-europe.fr>
* s-tposen.adb (Service_Entry): The object must be always unlocked at
the end of this procedure now that the unlock operation was inserted
by the expander.
2004-10-04 Jose Ruiz <ruiz@act-europe.fr>
* targparm.ads, targparm.adb (Targparm_Tags): Add PAS value

View file

@ -574,43 +574,48 @@ package body System.Tasking.Protected_Objects.Single_Entry is
-------------------
procedure Service_Entry (Object : Protection_Entry_Access) is
Self_Id : constant Task_Id := STPO.Self;
Entry_Call : constant Entry_Call_Link := Object.Entry_Queue;
Caller : Task_Id;
Self_Id : constant Task_Id := STPO.Self;
Entry_Call : constant Entry_Call_Link := Object.Entry_Queue;
Caller : Task_Id;
begin
if Entry_Call /= null then
if Object.Entry_Body.Barrier (Object.Compiler_Info, 1) then
Object.Entry_Queue := null;
if Entry_Call /= null
and then Object.Entry_Body.Barrier (Object.Compiler_Info, 1)
then
Object.Entry_Queue := null;
if Object.Call_In_Progress /= null then
-- This violates the No_Entry_Queue restriction, send
-- Program_Error to the caller.
if Object.Call_In_Progress /= null then
Send_Program_Error (Self_Id, Entry_Call);
Unlock_Entry (Object);
return;
end if;
-- Violation of No_Entry_Queue restriction, raise exception
Object.Call_In_Progress := Entry_Call;
Object.Entry_Body.Action
(Object.Compiler_Info, Entry_Call.Uninterpreted_Data, 1);
Object.Call_In_Progress := null;
Caller := Entry_Call.Self;
Send_Program_Error (Self_Id, Entry_Call);
Unlock_Entry (Object);
if Single_Lock then
STPO.Lock_RTS;
end if;
STPO.Write_Lock (Caller);
Wakeup_Entry_Caller (Self_Id, Entry_Call, Done);
STPO.Unlock (Caller);
if Single_Lock then
STPO.Unlock_RTS;
end if;
return;
end if;
Object.Call_In_Progress := Entry_Call;
Object.Entry_Body.Action
(Object.Compiler_Info, Entry_Call.Uninterpreted_Data, 1);
Object.Call_In_Progress := null;
Caller := Entry_Call.Self;
Unlock_Entry (Object);
if Single_Lock then
STPO.Lock_RTS;
end if;
STPO.Write_Lock (Caller);
Wakeup_Entry_Caller (Self_Id, Entry_Call, Done);
STPO.Unlock (Caller);
if Single_Lock then
STPO.Unlock_RTS;
end if;
else
-- Just unlock the entry
Unlock_Entry (Object);
end if;
exception