Contents Index Search Previous Next
9.5.1 Protected Subprograms and Protected Actions
1
{protected subprogram}
{protected procedure}
{protected function}
A
protected subprogram is a subprogram declared
immediately within a
protected_definition.
Protected procedures provide exclusive read-write access to the data
of a protected object; protected functions provide concurrent read-only
access to the data.
1.a
Ramification: A subprogram
declared immediately within a protected_body
is not a protected subprogram; it is an intrinsic subprogram. See 6.3.1,
``Conformance Rules''.
Static Semantics
2
Within the body of a protected function (or a
function declared immediately within a protected_body),
the current instance of the enclosing protected unit is defined to be
a constant [(that is, its subcomponents may be read but not updated)].
Within the body of a protected procedure (or a procedure declared immediately
within a protected_body), and within
an entry_body, the current instance
is defined to be a variable [(updating is permitted)].
2.a
Ramification: The current
instance is like an implicit parameter, of mode in for a protected
function, and of mode in out for a protected procedure (or protected
entry).
Dynamic Semantics
3
{execution (protected subprogram
call) [partial]} For the execution of
a call on a protected subprogram, the evaluation of the
name
or
prefix and of the parameter associations,
and any assigning back of
in out or
out parameters, proceeds
as for a normal subprogram call (see
6.4).
If the call is an internal call (see
9.5),
the body of the subprogram is executed as for a normal subprogram call.
If the call is an external call, then the body of the subprogram is executed
as part of a new
protected action on the target protected object;
the protected action completes after the body of the subprogram is executed.
[A protected action can also be started by an entry call (see
9.5.3).]
4
{protected
action} A new protected action is not
started on a protected object while another protected action on the same
protected object is underway, unless both actions are the result of a
call on a protected function. This rule is expressible in terms of the
execution resource associated with the protected object:
5
- {protected action
(start)} {acquire (execution
resource associated with protected object)} Starting
a protected action on a protected object corresponds to acquiring
the execution resource associated with the protected object, either for
concurrent read-only access if the protected action is for a call on
a protected function, or for exclusive read-write access otherwise;
6
- {protected action
(complete)} {release
(execution resource associated with protected object)} Completing
the protected action corresponds to releasing the associated execution
resource.
7
[After performing an operation on a protected
object other than a call on a protected function, but prior to completing
the associated protected action, the entry queues (if any) of the protected
object are serviced (see
9.5.3).]
Bounded (Run-Time) Errors
8
{bounded
error (cause) [partial]} During a protected
action, it is a bounded error to invoke an operation that is
potentially
blocking.
{potentially blocking operation}
{blocking, potentially}
The following are defined to be potentially blocking
operations:
8.a
Reason: Some of these
operations are not directly blocking. However, they are still treated
as bounded errors during a protected action, because allowing them might
impose an undesirable implementation burden.
9
10
11
12
13
14
- task creation or activation;
15
- an external call on a protected subprogram
(or an external requeue) with the same target object as that of the protected
action;
15.a
Reason: This is really
a deadlocking call, rather than a blocking call, but we include it in
this list for simplicity.
16
- a call on a subprogram whose body
contains a potentially blocking operation.
16.a
Reason: This allows an
implementation to check and raise Program_Error as soon as a subprogram
is called, rather than waiting to find out whether it actually reaches
the potentially blocking operation. This in turn allows the potentially
blocking operation check to be performed prior to run time in some environments.
17
{Program_Error (raised by
failure of run-time check)} If the bounded
error is detected, Program_Error is raised. If not detected, the bounded
error might result in deadlock or a (nested) protected action on the
same target object.
18
Certain language-defined subprograms are potentially
blocking. In particular, the subprograms of the language-defined input-output
packages that manipulate files (implicitly or explicitly) are potentially
blocking. Other potentially blocking subprograms are identified where
they are defined. When not specified as potentially blocking, a language-defined
subprogram is nonblocking.
19
18 If two tasks both try
to start a protected action on a protected object, and at most one is
calling a protected function, then only one of the tasks can proceed.
Although the other task cannot proceed, it is not considered blocked,
and it might be consuming processing resources while it awaits its turn.
There is no language-defined ordering or queuing presumed for tasks competing
to start a protected action -- on a multiprocessor such tasks might use
busy-waiting; for monoprocessor considerations, see D.3,
``Priority Ceiling Locking''.
19.a
Discussion: The intended
implementation on a multi-processor is in terms of ``spin locks'' --
the waiting task will spin.
20
19 The body of a protected
unit may contain declarations and bodies for local subprograms. These
are not visible outside the protected unit.
21
20 The body of a protected
function can contain internal calls on other protected functions, but
not protected procedures, because the current instance is a constant.
On the other hand, the body of a protected procedure can contain internal
calls on both protected functions and procedures.
22
21 From within a protected
action, an internal call on a protected subprogram, or an external call
on a protected subprogram with a different target object is not considered
a potentially blocking operation.
22.a
Reason: This is because
a task is not considered blocked while attempting to acquire the execution
resource associated with a protected object. The acquisition of such
a resource is rather considered part of the normal competition for execution
resources between the various tasks that are ready. External calls that
turn out to be on the same target object are considered potentially blocking,
since they can deadlock the task indefinitely.
Examples
23
Examples of
protected subprogram calls (see 9.4):
24
Shared_Array.Set_Component(N, E);
E := Shared_Array.Component(M);
Control.Release;
Contents Index Search Previous Next Legal