1
This clause 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.
2
The following language−defined package exists:
3/2
package Ada.Synchronous_Task_Control is pragma Preelaborate(Synchronous_Task_Control);
4
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;
5
The type Suspension_Object is a by−reference type.
6/2
An object of the type Suspension_Object has two visible states: True and False. Upon initialization, its value is set to False.
7/2
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.
8
Current_State returns the current state of the object.
9/2
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.
10
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).
11
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.