Contents Index Previous Next
E.5 Partition Communication Subsystem
1
{partition communication subsystem
(PCS)} {PCS (partition
communication subsystem)} [The
Partition
Communication Subsystem (PCS) provides facilities for supporting
communication between the active partitions of a distributed program.
The package System.RPC is a language-defined interface to the PCS.] An
implementation conforming to this Annex shall use the RPC interface to
implement remote subprogram calls.
1.a
Reason: The prefix RPC
is used rather than RSC because the term remote procedure call and its
acronym are more familiar.
Static Semantics
2
The following language-defined
library package exists:
3
with Ada.Streams; -- see 13.13.1
package System.RPC is
4
type Partition_ID is range 0 .. implementation-defined;
5
Communication_Error : exception;
6
type Params_Stream_Type (
Initial_Size : Ada.Streams.Stream_Element_Count) is new
Ada.Streams.Root_Stream_Type with private;
7
procedure Read(
Stream : in out Params_Stream_Type;
Item : out Ada.Streams.Stream_Element_Array;
Last : out Ada.Streams.Stream_Element_Offset);
8
procedure Write(
Stream : in out Params_Stream_Type;
Item : in Ada.Streams.Stream_Element_Array);
9
-- Synchronous call
procedure Do_RPC(
Partition : in Partition_ID;
Params : access Params_Stream_Type;
Result : access Params_Stream_Type);
10
-- Asynchronous call
procedure Do_APC(
Partition : in Partition_ID;
Params : access Params_Stream_Type);
11
-- The handler for incoming RPCs
type RPC_Receiver is access procedure(
Params : access Params_Stream_Type;
Result : access Params_Stream_Type);
12
procedure Establish_RPC_Receiver(
Partition : in Partition_ID;
Receiver : in RPC_Receiver);
13
private
... -- not specified by the language
end System.RPC;
14
A value of the type Partition_ID is used to identify
a partition.
15
An object of the type Params_Stream_Type is used
for identifying the particular remote subprogram that is being called,
as well as marshalling and unmarshalling the parameters or result of
a remote subprogram call, as part of sending them between partitions.
16
[The Read and Write procedures override the corresponding
abstract operations for the type Params_Stream_Type.]
Dynamic Semantics
17
The Do_RPC and Do_APC procedures send a message
to the active partition identified by the Partition parameter.
17.a
Implementation Note: It
is assumed that the RPC interface is above the message-passing layer
of the network protocol stack and is implemented in terms of it.
18
After sending the message, Do_RPC blocks the
calling task until a reply message comes back from the called partition
or some error is detected by the underlying communication system in which
case Communication_Error is raised at the point of the call to Do_RPC.
18.a
Reason: Only one exception
is defined in System.RPC, although many sources of errors might exist.
This is so because it is not always possible to distinguish among these
errors. In particular, it is often impossible to tell the difference
between a failing communication link and a failing processing node. Additional
information might be associated with a particular Exception_Occurrence
for a Communication_Error.
19
Do_APC operates in the same way as Do_RPC except
that it is allowed to return immediately after sending the message.
20
Upon normal return, the stream designated by
the Result parameter of Do_RPC contains the reply message.
21
{elaboration (partition)
[partial]} The procedure System.RPC.Establish_RPC_Receiver
is called once, immediately after elaborating the library units of an
active partition (that is, right after the
elaboration of the partition)
if the partition includes an RCI library unit, but prior to invoking
the main subprogram, if any. The Partition parameter is the Partition_ID
of the active partition being elaborated.
{RPC-receiver}
The Receiver parameter designates an implementation-provided
procedure called the
RPC-receiver which will handle all RPCs received
by the partition from the PCS. Establish_RPC_Receiver saves a reference
to the RPC-receiver; when a message is received at the called partition,
the RPC-receiver is called with the Params stream containing the message.
When the RPC-receiver returns, the contents of the stream designated
by Result is placed in a message and sent back to the calling partition.
21.a
Implementation Note: It
is defined by the PCS implementation whether one or more threads of control
should be available to process incoming messages and to wait for their
completion.
21.b
Implementation Note: At
link-time, the linker provides the RPC-receiver and the necessary tables
to support it. A call on Establish_RPC_Receiver is inserted just before
the call on the main subprogram.
21.c
Reason: The interface between
the PCS (the System.RPC package) and the RPC-receiver is defined to be
dynamic in order to allow the elaboration sequence to notify the PCS
that all packages have been elaborated and that it is safe to call the
receiving stubs. It is not guaranteed that the PCS units will be the
last to be elaborated, so some other indication that elaboration is complete
is needed.
22
If a call on Do_RPC is aborted, a cancellation
message is sent to the called partition, to request that the execution
of the remotely called subprogram be aborted.
22.a
To be honest: The full
effects of this message are dependent on the implementation of the PCS.
23
{potentially blocking operation
(RPC operations) [partial]} {blocking,
potentially (RPC operations) [partial]} The
subprograms declared in System.RPC are potentially blocking operations.
Implementation Requirements
24
The implementation of the RPC-receiver shall
be reentrant[, thereby allowing concurrent calls on it from the PCS to
service concurrent remote subprogram calls into the partition].
24.a
Reason: There seems no
reason to allow the implementation of RPC-receiver to be nonreentrant,
even though we don't require that every implementation of the PCS actually
perform concurrent calls on the RPC-receiver.
24.1/1
{
8652/0087}
An implementation shall not restrict the replacement of the body of System.RPC.
An implementation shall not restrict children of System.RPC. [The related implementation
permissions in the introduction to Annex A do not apply.]
24.a.1/1
Reason: The point of
System.RPC is to let the user tailor the communications mechanism without
requiring changes to or other cooperation from the compiler. However,
implementations can restrict the replacement of language-defined units.
This requirement overrides that permission for System.RPC.
24.2/1
{
8652/0087}
If the implementation of System.RPC is provided by the user, an implementation
shall support remote subprogram calls as specified.
Documentation Requirements
25
The implementation of the PCS shall document
whether the RPC-receiver is invoked from concurrent tasks. If there is
an upper limit on the number of such tasks, this limit shall be documented
as well, together with the mechanisms to configure it (if this is supported).
25.a
Implementation defined: Implementation-defined
aspects of the PCS.
Implementation Permissions
26
The PCS is allowed to contain implementation-defined
interfaces for explicit message passing, broadcasting, etc. Similarly,
it is allowed to provide additional interfaces to query the state of
some remote partition (given its partition ID) or of the PCS itself,
to set timeouts and retry parameters, to get more detailed error status,
etc. These additional interfaces should be provided in child packages
of System.RPC.
26.a
Implementation defined: Implementation-defined
interfaces in the PCS.
27
A body for the package System.RPC need not be
supplied by the implementation.
27.a
Reason: It is presumed
that a body for the package System.RPC might be extremely environment
specific. Therefore, we do not require that a body be provided by the
(compiler) implementation. The user will have to write a body, or acquire
one, appropriate for the target environment.
Implementation Advice
28
Whenever possible, the PCS on the called partition
should allow for multiple tasks to call the RPC-receiver with different
messages and should allow them to block until the corresponding subprogram
body returns.
29
The Write operation on a stream of type Params_Stream_Type
should raise Storage_Error if it runs out of space trying to write the
Item into the stream.
29.a
Implementation Note: An
implementation could also dynamically allocate more space as needed,
only propagating Storage_Error if the allocator
it calls raises Storage_Error. This storage could be managed through
a controlled component of the stream object, to ensure that it is reclaimed
when the stream object is finalized.
30
8 The package System.RPC
is not designed for direct calls by user programs. It is instead designed
for use in the implementation of remote subprograms calls, being called
by the calling stubs generated for a remote call interface library unit
to initiate a remote call, and in turn calling back to an RPC-receiver
that dispatches to the receiving stubs generated for the body of a remote
call interface, to handle a remote call received from elsewhere.
Contents Index Previous Next Legal