- (1)
- A remote subprogram call is a subprogram call that invokes the execution
of a subprogram in another partition.  The partition that originates the
remote subprogram call is the calling partition, and the partition that
executes the corresponding subprogram body is the called partition.  Some
remote procedure calls are allowed to return prior to the completion of
subprogram execution. These are called asynchronous remote procedure calls.
- (2)
- There are three different ways of performing a remote subprogram call:
- (3)
- As a direct call on a (remote) subprogram explicitly declared in
a remote call interface;
 
- (4)
- As an indirect call through a value of a remote
access-to-subprogram type;
 
- (5)
- As a dispatching call with a controlling operand designated by a
value of a remote access-to-class-wide type.
 
- (6)
- The first way of calling corresponds to a static binding between the
calling and the called partition.  The latter two ways correspond to a
dynamic binding between the calling and the called partition.
- (7)
  
- A remote call interface library unit (see E.2.3) 
    defines the remote subprograms or remote access types used for remote subprogram 
    calls. 
Legality Rules
- (8)
- In a dispatching call with two or more controlling operands, if one
controlling operand is designated by a value of a remote access-to-class-wide
type, then all shall be.
Dynamic Semantics
- (9)
  
- For the execution of a remote subprogram call, subprogram parameters (and 
    later the results, if any) are passed using a stream-oriented representation 
    (see 13.13.1) which is suitable for transmission 
    between partitions. This action is called marshalling. Unmarshalling is the 
    reverse action of reconstructing the parameters or results from the stream-oriented 
    representation. Marshalling is performed initially as part of the remote subprogram 
    call in the calling partition; unmarshalling is done in the called partition. 
    After the remote subprogram completes, marshalling is performed in the called 
    partition, and finally unmarshalling is done in the calling partition. 
  
- (10)
- A calling stub is the sequence of code that replaces the subprogram body
of a remotely called subprogram in the calling partition. A receiving stub is
the sequence of code (the ``wrapper'') that receives a remote subprogram call
on the called partition and invokes the appropriate subprogram body.
- (11)
- Remote subprogram calls are executed at most once, that is, if the
subprogram call returns normally, then the called subprogram's body was
executed exactly once.
- (12)
- The task executing a remote subprogram call blocks until the subprogram
in the called partition returns, unless the call is asynchronous. For an
asynchronous remote procedure call, the calling task can become ready before
the procedure in the called partition returns.
- (13)
- If a construct containing a remote call is aborted, the remote
subprogram call is cancelled.  Whether the execution of the remote subprogram
is immediately aborted as a result of the cancellation is implementation
defined.
- (14)
- If a remote subprogram call is received by a called partition before the
partition has completed its elaboration, the call is kept pending until the
called partition completes its elaboration (unless the call is cancelled by
the calling partition prior to that).
- (15)
- If an exception is propagated by a remotely called subprogram, and the
call is not an asynchronous call, the corresponding exception is reraised at
the point of the remote subprogram call.  For an asynchronous call, if the
remote procedure call returns prior to the completion of the remotely called
subprogram, any exception is lost.
- (16)
  
- The exception Communication_Error (see E.5) is raised 
    if a remote call cannot be completed due to difficulties in communicating 
    with the called partition. 
  
- (17)
  
- All forms of remote subprogram calls are potentially blocking operations 
    (see 9.5.1). 
  
- (18)
- In a remote subprogram call with a formal parameter of a class-wide
type, a check is made that the tag of the actual parameter identifies a
tagged type declared in a declared-pure or shared passive library unit, or in
the visible part of a remote types or remote call interface library unit.
Program_Error is raised if this check fails.
- (19)
  
- In a dispatching call with two or more controlling operands that are designated 
    by values of a remote access-to-class-wide type, a check is made (in addition 
    to the normal Tag_Check -- see 11.5) that all the 
    remote access-to-class-wide values originated from Access attribute_references 
    that were evaluated by tasks of the same active partition. Constraint_Error 
    is raised if this check fails. 
Implementation Requirements
- (20)
  
- The implementation of remote subprogram calls shall conform to the PCS interface 
    as defined by the specification of the language-defined package System.RPC 
    (see E.5). The calling stub shall use the Do_RPC procedure 
    unless the remote procedure call is asynchronous in which case Do_APC shall 
    be used. On the receiving side, the corresponding receiving stub shall be 
    invoked by the RPC-receiver. 
    
- 
- (21)
- (6) A given active partition can both make and receive remote subprogram
calls.  Thus, an active partition can act as both a client and a server.
 
- (22)
- (7) If a given exception is propagated by a remote subprogram call, but
the exception does not exist in the calling partition, the exception can
be handled by an others choice or be propagated to and handled by a
third partition.
 
Subclauses
  - Pragma Asynchronous 
  
- Example of Use of a Remote Access-to-Class-Wide Type 
  -- Email comments, additions, corrections, gripes, kudos, etc. to:
 
  -- Email comments, additions, corrections, gripes, kudos, etc. to: 
 Magnus Kempe -- Magnus.Kempe@di.epfl.ch
Copyright statement
Page last generated: 95-03-12