E.2.2 Remote Types Library Units
1
[A remote types library unit supports the definition
of types intended for use in communication between active partitions.]
Language Design Principles
1.a
The restrictions governing a remote types package
are similar to those for a declared pure package. However, the restrictions
are relaxed deliberately to allow such a package to contain declarations
that violate the stateless property of pure packages, though it is presumed
that any state-dependent properties are essentially invisible outside
the package.
Syntax
2
The
form of a
pragma
Remote_Types is as follows:
3
pragma Remote_Types[(
library_unit_name)];
Legality Rules
4/3
{
AI05-0243-1}
A
pragma
Remote_Types is used to specify that a library unit is a remote
types library unit, namely that the is a library unit to which the pragma Remote_Types
aspect
of the library unit is True applies.
The following restrictions apply to the declaration of such a library
unit:
4.a/3
Aspect Description
for Remote_Types: Types
in a given package may be used in remote procedure calls.
5
[it shall be preelaborable;]
6/3
{
AI05-0206-1}
{
AI05-0243-1}
it shall depend semantically only on declared pure
library_items,
shared passive
library units,
or
other remote types library units
, or preelaborated
normal library units that are mentioned only in private with clauses;
6.a/3
Ramification: {
AI05-0243-1}
We say declared pure library_item
here, so that (all) limited views are allowed; those are not library
units, but they are declared pure library_items.
7
it shall not contain the declaration of any variable
within the visible part of the library unit;
7.a
Reason: This is essentially a “methodological”
restriction. A separate copy of a remote types package is included in
each partition that references it, just like a normal package. Nevertheless,
a remote types package is thought of as an “essentially pure”
package for defining types to be used for interpartition communication,
and it could be misleading to declare visible objects when no remote
data access is actually being provided.
8/2
{
AI95-00240-01}
{
AI95-00366-01}
if the full view of
each a
type declared in the visible part of the library unit
that
has any available stream attributes shall support external streaming
(see 13.13.2) has
a part that is of a non-remote access type, then that access type, or
the type of some part that includes the access type subcomponent, shall
have user-specified Read and Write attributes.
8.a
Reason: This is to prevent the use of
the predefined Read and Write attributes of an access type as part of
the Read and Write attributes of a visible type.
8.b/2
Ramification: {
AI95-00366-01}
Types that do not have available stream attributes
are excluded from this rule; that means that attributes do not need to
be specified for most limited types. It is only necessary to specify
attributes for nonlimited types that have a part that is of any access
type, and for extensions of limited types with available stream attributes
where the record_extension_part
includes a subcomponent of an access type, where the access type does
not have specified attributes.
9/3
{
8652/0082}
{
AI95-00164-01}
{
AI05-0060-1}
A
named An access type declared in
the visible part of a remote types or remote call interface library unit
is called a
remote access type.
Such
a type shall be
: either
an access-to-subprogram type or a general access type that designates
a class-wide limited private type.
9.1/1
9.2/3
{
8652/0082}
{
AI95-00164-01}
{
AI05-0060-1}
a general access type that designates a class-wide
limited private type, a class-wide limited
interface type, or a class-wide private
type extension
all of whose ancestors are either private type
extensions,
limited interface types, or limited private
types.
9.3/1
10
The following restrictions
apply to the use of a remote access-to-subprogram type:
11/2
{
AI95-00431-01}
A value of a remote access-to-subprogram type shall be converted only
to
or from another (subtype-conformant)
remote access-to-subprogram type;
12
The
prefix
of an Access
attribute_reference
that yields a value of a remote access-to-subprogram type shall statically
denote a (subtype-conformant) remote subprogram.
13
The following restrictions
apply to the use of a remote access-to-class-wide type:
14/3
{
8652/0083}
{
AI95-00047-01}
{
AI95-00240-01}
{
AI95-00366-01}
{
AI05-0060-1}
{
AI05-0101-1}
The primitive subprograms of the corresponding specific
limited
private type shall only have access parameters if they are controlling
formal parameters
. The primitive functions of the
corresponding specific type shall only have an access result if it is
a controlling access result.; Each each non-controlling formal parameter the types
of all the non-controlling formal parameters and
non-controlling result type shall
support
external streaming (see 13.13.2); have
either a nonlimited
type or a type with Read and Write
attributes specified
via an attribute_definition_clause;.
14.1/3
15
A value of a remote access-to-class-wide type shall
be explicitly converted only to another remote access-to-class-wide type;
16
A value of a remote access-to-class-wide type shall
be dereferenced (or implicitly converted to an anonymous access type)
only as part of a dispatching call where the value designates a controlling
operand of the call (see
E.4, “
Remote
Subprogram Calls”);
16.1/3
{
AI05-0101-1}
A controlling access result value for a primitive
function with any controlling operands of the corresponding specific
type shall either be explicitly converted to a remote access-to-class-wide
type or be part of a dispatching call where the value designates a controlling
operand of the call;
17/2
{
AI95-00366-01}
The Storage_Pool
attribute is and
Storage_Size attributes are not defined for
a remote access-to-class-wide
type types;
the expected type for an
allocator
shall not be a remote access-to-class-wide type
.
A; a remote access-to-class-wide
type shall not be an actual parameter for a generic formal access type
.; The Storage_Size attribute of a remote access-to-class-wide type yields
0; it is not allowed in an attribute_definition_clause.
17.a/3
Reason: {
AI05-0005-1}
All
three of these restrictions are because
there is no storage pool associated with a remote access-to-class-wide
type.
The Storage_Size is defined to be 0 so that
there is no conflict with the rules for pure units.
18
5 A remote types library unit need not
be pure, and the types it defines may include levels of indirection implemented
by using access types. User-specified Read and Write attributes (see
13.13.2) provide for sending values of
such a type between active partitions, with Write marshalling the representation,
and Read unmarshalling any levels of indirection.
19/3
6 {
AI05-0060-1}
The value of a remote access-to-class-wide limited
interface can designate an object of a nonlimited type derived from the
interface.
20/3
7 {
AI05-0060-1}
A remote access type may designate a class-wide
synchronized, protected, or task interface type.
20.a/3
Proof: Synchronized,
protected, and task interfaces are all considered limited interfaces,
see 3.9.4.
Incompatibilities With Ada 95
20.b/3
{
AI95-00240-01}
{
AI05-0248-1}
Amendment Correction:
The wording was changed from “user-specified” to “available”
read and write attributes.
(This was then further changed, see below.) This means that an access
type with the attributes specified in the private part would originally
have been sufficient to allow the access type to be used in a remote
type, but that is no longer allowed. Similarly, the attributes of a remote
type that has access components have to be specified in the visible part.
These changes were made so that the rules were consistent with the rules
introduced for the Corrigendum for stream attributes; moreover, legality
should not depend on the contents of the private part.
Extensions to Ada 95
20.c/3
{
AI95-00366-01}
{
AI05-0005-1}
Remote types that cannot be
streamed (that is, have no available stream attributes) do not require
the specification of stream attributes. This is necessary so that most
extensions of Limited_Controlled do not need stream attributes defined
(otherwise there would be a significant signficant incompatibility, as Limited_Controlled would need stream attributes,
and then all extensions of it also would need stream attributes).
Wording Changes from Ada 95
20.d/2
{
8652/0081}
{
AI95-00004-01}
Corrigendum: Added missing wording so that
a type derived from a remote access type is also a remote access type.
20.e/2
{
8652/0083}
{
AI95-00047-01}
Corrigendum: Clarified that user-defined
Read and Write attributes are required for the primitive subprograms
corresponding to a remote access-to-class-wide type.
20.f/2
{
8652/0082}
{
AI95-00164-01}
Corrigendum: Added missing wording so that
a remote access type can designate an appropriate private extension.
20.g/2
{
AI95-00366-01}
Changed the wording to use the newly defined term
type that supports external streaming, so that various issues
with access types in pure units and implicitly declared attributes for
type extensions are properly handled.
20.h/2
{
AI95-00366-01}
Defined Storage_Size to be 0 for remote access-to-class-wide
types, rather than having it undefined. This eliminates issues with pure
units requiring a defined storage size.
20.i/2
{
AI95-00431-01}
Corrected the wording so that a value of a local
access-to-subprogram type cannot be converted to a remote access-to-subprogram
type, as intended (and required by the ACATS).
Incompatibilities With Ada 2005
20.j/3
{
AI05-0101-1}
Correction: Added rules
for returning of remote access-to-classwide types; this had been missed
in the past. While programs that returned unstreamable types from RCI
functions were legal, it is not clear what they could have done (as the
results could not be marshalled). Similarly, RCI functions that return
remote controlling access types could try to save those values, but it
is unlikely that a compiler would know how to do that usefully. Thus,
it seems unlikely that any real programs will be impacted by these changes.
Extensions to Ada 2005
20.k/3
{
AI05-0060-1}
Correction: Clarified
that anonymous access types are never remote access types (and can be
used in remote types units subject to the normal restrictions). Added
wording to allow limited class-wide interfaces to be designated by remote
access types.
20.l/3
{
AI05-0206-1}
Added wording to allow private withs of preelaborated
normal units in the specification of a remote types unit.
20.m/3
{
AI05-0243-1}
Remote_Types is now a categorization
aspect, so it can be specified by an aspect_specification
— although the pragma is still preferred by the Standard.
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe