D.10 Synchronous Task Control
This subclause describes a language-defined private 
semaphore (suspension object), which can be used for two-stage suspend 
operations and as a simple building block for implementing higher-level 
queues. 
Static Semantics
The following language-defined 
package exists: 
package Ada.Synchronous_Task_Control 
is
  pragma Preelaborate(Synchronous_Task_Control);
 
  type Suspension_Object 
is limited private;
  
procedure Set_True(S : 
in out Suspension_Object);
  
procedure Set_False(S : 
in out Suspension_Object);
  
function Current_State(S : Suspension_Object) 
return Boolean;
  
procedure Suspend_Until_True(S : 
in out Suspension_Object);
private
     ... -- 
not specified by the language
end Ada.Synchronous_Task_Control;
 
The type Suspension_Object is a by-reference type.
  The following language-defined 
package exists: 
package Ada.Synchronous_Task_Control.EDF 
is
   procedure Suspend_Until_True_And_Set_Deadline
      (S  : 
in out Suspension_Object;
       TS : 
in     Ada.Real_Time.Time_Span);
end Ada.Synchronous_Task_Control.EDF;
 
Dynamic Semantics
An object of the type Suspension_Object has two visible 
states: True and False. Upon initialization, its value is set to False. 
The operations Set_True and Set_False are atomic 
with respect to each other and with respect to Suspend_Until_True; they 
set the state to True and False respectively.
Current_State returns the current state of the object. 
The procedure Suspend_Until_True blocks the calling 
task until the state of the object S is True; at that point the task 
becomes ready and the state of the object becomes False.
Program_Error 
is raised upon calling Suspend_Until_True if another task is already 
waiting on that suspension object. Suspend_Until_True is a potentially 
blocking operation (see 
9.5.1).
 
   The procedure Suspend_Until_True_And_Set_Deadline 
blocks the calling task until the state of the object S is True; at that 
point the task becomes ready with a deadline of Ada.Real_Time.Clock + 
TS, and the state of the object becomes False. Program_Error is raised 
upon calling Suspend_Until_True_And_Set_Deadline if another task is already 
waiting on that suspension object. Suspend_Until_True_And_Set_Deadline 
is a potentially blocking operation. 
Implementation Requirements
The implementation is required to allow the calling 
of Set_False and Set_True during any protected action, even one that 
has its ceiling priority in the Interrupt_Priority range.
37  More complex schemes, such as setting 
the deadline relative to when Set_True is called, can be programmed using 
a protected object. 
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe