------------------------------------------------------------------------------
-- --
--- GNAT RUNTIME COMPONENTS --
+-- GNAT RUN-TIME COMPONENTS --
-- --
-- A D A . S Y N C H R O N O U S _ T A S K _ C O N T R O L --
-- --
-- B o d y --
-- --
--- --
--- Copyright (C) 1992-2001 Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2009, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
--- ware Foundation; either version 2, or (at your option) any later ver- --
+-- ware Foundation; either version 3, or (at your option) any later ver- --
-- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
--- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
--- for more details. You should have received a copy of the GNU General --
--- Public License distributed with GNAT; see file COPYING. If not, write --
--- to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, --
--- MA 02111-1307, USA. --
+-- or FITNESS FOR A PARTICULAR PURPOSE. --
+-- --
+-- As a special exception under Section 7 of GPL version 3, you are granted --
+-- additional permissions described in the GCC Runtime Library Exception, --
+-- version 3.1, as published by the Free Software Foundation. --
-- --
--- As a special exception, if other files instantiate generics from this --
--- unit, or you link this unit with other files to produce an executable, --
--- this unit does not by itself cause the resulting executable to be --
--- covered by the GNU General Public License. This exception does not --
--- however invalidate any other reasons why the executable file might be --
--- covered by the GNU Public License. --
+-- You should have received a copy of the GNU General Public License and --
+-- a copy of the GCC Runtime Library Exception along with this program; --
+-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
+-- <http://www.gnu.org/licenses/>. --
-- --
-- GNAT was originally developed by the GNAT team at New York University. --
--- It is now maintained by Ada Core Technologies Inc (http://www.gnat.com). --
+-- Extensive contributions were provided by Ada Core Technologies Inc. --
-- --
------------------------------------------------------------------------------
+with Ada.Exceptions;
-package body Ada.Synchronous_Task_Control is
-
- -------------------
- -- Suspension_PO --
- -------------------
-
- protected body Suspension_Object is
-
- --------------
- -- Get_Open --
- --------------
-
- function Get_Open return Boolean is
- begin
- return Open;
- end Get_Open;
-
- ---------------
- -- Set_False --
- ---------------
+with System.Tasking;
+with System.Task_Primitives.Operations;
- procedure Set_False is
- begin
- Open := False;
- end Set_False;
-
- --------------
- -- Set_True --
- --------------
-
- procedure Set_True is
- begin
- Open := True;
- end Set_True;
-
- ----------
- -- Wait --
- ----------
-
- entry Wait when Open is
- begin
- Open := False;
- end Wait;
+package body Ada.Synchronous_Task_Control is
- --------------------
- -- Wait_Exception --
- --------------------
+ ----------------
+ -- Initialize --
+ ----------------
- entry Wait_Exception when True is
- begin
- if Wait'Count /= 0 then
- raise Program_Error;
- end if;
+ procedure Initialize (S : in out Suspension_Object) is
+ begin
+ System.Task_Primitives.Operations.Initialize (S.SO);
+ end Initialize;
- requeue Wait;
- end Wait_Exception;
+ --------------
+ -- Finalize --
+ --------------
- end Suspension_Object;
+ procedure Finalize (S : in out Suspension_Object) is
+ begin
+ System.Task_Primitives.Operations.Finalize (S.SO);
+ end Finalize;
-------------------
-- Current_State --
function Current_State (S : Suspension_Object) return Boolean is
begin
- return S.Get_Open;
+ return System.Task_Primitives.Operations.Current_State (S.SO);
end Current_State;
---------------
procedure Set_False (S : in out Suspension_Object) is
begin
- S.Set_False;
+ System.Task_Primitives.Operations.Set_False (S.SO);
end Set_False;
--------------
procedure Set_True (S : in out Suspension_Object) is
begin
- S.Set_True;
+ System.Task_Primitives.Operations.Set_True (S.SO);
end Set_True;
------------------------
procedure Suspend_Until_True (S : in out Suspension_Object) is
begin
- S.Wait_Exception;
+ -- This is a potentially blocking (see ARM D.10, par. 10), so that
+ -- if pragma Detect_Blocking is active then Program_Error must be
+ -- raised if this operation is called from a protected action.
+
+ if System.Tasking.Detect_Blocking
+ and then System.Tasking.Self.Common.Protected_Action_Nesting > 0
+ then
+ Ada.Exceptions.Raise_Exception
+ (Program_Error'Identity, "potentially blocking operation");
+ end if;
+
+ System.Task_Primitives.Operations.Suspend_Until_True (S.SO);
end Suspend_Until_True;
end Ada.Synchronous_Task_Control;