1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<HEAD>
<TITLE>AARM95 - Remote Call Interface Library Units</TITLE>
<META NAME="Author" CONTENT="JTC1/SC22/WG9/ARG, by Randall Brukardt, ARG Editor">
<META NAME="GENERATOR" CONTENT="Arm_Form.Exe, Ada Reference Manual generator">
<STYLE type="text/css">
DIV.paranum {position: absolute; font-family: Arial, Helvetica, sans-serif; left: 0.5 em; top: auto}
TT {font-family: "Courier New", monospace}
DT {display: compact}
DIV.Normal {font-family: "Times New Roman", Times, serif; margin-bottom: 0.6em}
DIV.Wide {font-family: "Times New Roman", Times, serif; margin-top: 0.6em; margin-bottom: 0.6em}
DIV.Annotations {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-bottom: 0.6em}
DIV.WideAnnotations {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-top: 0.6em; margin-bottom: 0.6em}
DIV.Index {font-family: "Times New Roman", Times, serif}
DIV.SyntaxSummary {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-bottom: 0.4em}
DIV.Notes {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-bottom: 0.6em}
DIV.NotesHeader {font-family: "Times New Roman", Times, serif; margin-left: 2.0em}
DIV.SyntaxIndented {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-bottom: 0.4em}
DIV.Indented {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-bottom: 0.6em}
DIV.CodeIndented {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-bottom: 0.6em}
DIV.SmallIndented {font-family: "Times New Roman", Times, serif; margin-left: 10.0em; margin-bottom: 0.6em}
DIV.SmallCodeIndented {font-family: "Times New Roman", Times, serif; margin-left: 8.0em; margin-bottom: 0.6em}
DIV.Examples {font-family: "Courier New", monospace; margin-left: 2.0em; margin-bottom: 0.6em}
DIV.SmallExamples {font-family: "Courier New", monospace; font-size: 80%; margin-left: 7.5em; margin-bottom: 0.6em}
DIV.IndentedExamples {font-family: "Courier New", monospace; margin-left: 8.0em; margin-bottom: 0.6em}
DIV.SmallIndentedExamples {font-family: "Courier New", monospace; font-size: 80%; margin-left: 15.0em; margin-bottom: 0.6em}
UL.Bulleted {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-right: 2.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.SmallBulleted {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-right: 6.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.NestedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-right: 4.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.SmallNestedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 8.0em; margin-right: 8.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.IndentedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 8.0em; margin-right: 8.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.CodeIndentedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-right: 6.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.CodeIndentedNestedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 8.0em; margin-right: 8.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.SyntaxIndentedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-right: 4.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.NotesBulleted {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-right: 4.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.NotesNestedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-right: 6.0em; margin-top: 0em; margin-bottom: 0.5em}
DL.Hanging {font-family: "Times New Roman", Times, serif; margin-top: 0em; margin-bottom: 0.6em}
DD.Hanging {margin-left: 6.0em}
DL.IndentedHanging {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-top: 0em; margin-bottom: 0.6em}
DD.IndentedHanging {margin-left: 2.0em}
DL.HangingInBulleted {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-right: 2.0em; margin-top: 0em; margin-bottom: 0.5em}
DD.HangingInBulleted {margin-left: 4.0em}
DL.SmallHanging {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-top: 0em; margin-bottom: 0.6em}
DD.SmallHanging {margin-left: 7.5em}
DL.SmallIndentedHanging {font-family: "Times New Roman", Times, serif; margin-left: 8.0em; margin-top: 0em; margin-bottom: 0.6em}
DD.SmallIndentedHanging {margin-left: 2.0em}
DL.SmallHangingInBulleted {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-right: 6.0em; margin-top: 0em; margin-bottom: 0.5em}
DD.SmallHangingInBulleted {margin-left: 5.0em}
DL.Enumerated {font-family: "Times New Roman", Times, serif; margin-right: 0.0em; margin-top: 0em; margin-bottom: 0.5em}
DD.Enumerated {margin-left: 2.0em}
DL.SmallEnumerated {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-right: 4.0em; margin-top: 0em; margin-bottom: 0.5em}
DD.SmallEnumerated {margin-left: 2.5em}
DL.NestedEnumerated {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-right: 2.0em; margin-top: 0em; margin-bottom: 0.5em}
DL.SmallNestedEnumerated {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-right: 6.0em; margin-top: 0em; margin-bottom: 0.5em}
</STYLE>
</HEAD>
<BODY TEXT="#000000" BGCOLOR="#FFFFF0" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000">
<P><A HREF="AA-TOC.html">Contents</A> <A HREF="AA-0-29.html">Index</A> <A HREF="AA-E-2-2.html">Previous</A> <A HREF="AA-E-3.html">Next</A></P>
<HR>
<H1> E.2.3 Remote Call Interface Library Units</H1>
<DIV Class="Paranum"><FONT SIZE=-2>1</FONT></DIV>
<DIV Class="Normal"> [A remote call interface library unit can be used
as an interface for remote procedure calls (RPCs) (or remote function
calls) between active partitions.] </DIV>
<H4 ALIGN=CENTER>Language Design Principles</H4>
<DIV Class="Paranum"><FONT SIZE=-2>1.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>The restrictions governing a remote
call interface library unit are intended to ensure that the values of
the actual parameters in a remote call can be meaningfully sent between
two active partitions. </FONT></DIV>
<H4 ALIGN=CENTER>Syntax</H4>
<DIV Class="Paranum"><FONT SIZE=-2>2</FONT></DIV>
<DIV Class="SyntaxIndented" Style="margin-bottom: 0.2em"><A NAME="I6988"></A><A NAME="I6989"></A>The
form of a <FONT FACE="Arial, Helvetica">pragma</FONT> Remote_Call_Interface
is as follows: </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>3</FONT></DIV>
<DIV Class="SyntaxIndented"> <B>pragma</B> <A NAME="I6990"></A>Remote_Call_Interface[(<I>library_unit_</I><A NAME="I6991"></A><FONT FACE="Arial, Helvetica">name</FONT>)];</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>4</FONT></DIV>
<DIV Class="SyntaxIndented" Style="margin-bottom: 0.2em">The form of
a <FONT FACE="Arial, Helvetica">pragma</FONT> All_Calls_Remote is as
follows: </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>5</FONT></DIV>
<DIV Class="SyntaxIndented"> <B>pragma</B> <A NAME="I6992"></A>All_Calls_Remote[(<I>library_unit_</I><A NAME="I6993"></A><FONT FACE="Arial, Helvetica">name</FONT>)];</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>6</FONT></DIV>
<DIV Class="SyntaxIndented"><A NAME="I6994"></A><A NAME="I6995"></A>A
<FONT FACE="Arial, Helvetica">pragma</FONT> All_Calls_Remote is a library
unit pragma. </DIV>
<H4 ALIGN=CENTER>Legality Rules</H4>
<DIV Class="Paranum"><FONT SIZE=-2>7/1</FONT></DIV>
<DIV Class="Normal"> {<I><A HREF="defect1.html#8652/0078">8652/0078</A></I>}
<A NAME="I6996"></A><A NAME="I6997"></A><A NAME="I6998"></A><A NAME="I6999"></A><A NAME="I7000"></A>A
<I>remote call interface (RCI)</I> is a library unit to which the pragma
Remote_Call_Interface applies. A subprogram declared in the visible part
of such a library unit<U>, or declared by such a library unit,</U> is
called a <I>remote subprogram</I>.</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>8</FONT></DIV>
<DIV Class="Normal"> The declaration of an RCI library unit shall be
preelaborable (see <A HREF="AA-10-2-1.html">10.2.1</A>), and shall depend
semantically only upon declared pure, shared passive, remote types, or
other remote call interface library units.</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>9/1</FONT></DIV>
<DIV Class="Normal"> {<I><A HREF="defect1.html#8652/0078">8652/0078</A></I>}
In addition, the following restrictions apply to <S>the visible part
of </S>an RCI library unit: </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>10/1</FONT></DIV>
<UL Class="Bulleted" Style="margin-bottom: 0.3em"><LI TYPE=DISC>{<I><A HREF="defect1.html#8652/0078">8652/0078</A></I>}
it<U>s visible part</U> shall not contain the declaration of a variable;
</LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>10.a/1</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Reason: </B>{<I><A HREF="defect1.html#8652/0078">8652/0078</A></I>}
Remote call interface <U>units</U><S>packages</S> do not provide remote
data access. A shared passive package has to be used for that. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>11/1</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC>{<I><A HREF="defect1.html#8652/0078">8652/0078</A></I>}
it<U>s visible part</U> shall not contain the declaration of a limited
type; </LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>11.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Reason: </B>We disallow the
declaration of task and protected types, since calling an entry or a
protected subprogram implicitly passes an object of a limited type (the
target task or protected object). We disallow other limited types since
we require that such types have user-defined Read and Write attributes,
but we certainly don't want the Read and Write attributes themselves
to involve remote calls (thereby defeating their purpose of marshalling
the value for remote calls). </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>12/1</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC>{<I><A HREF="defect1.html#8652/0078">8652/0078</A></I>}
it<U>s visible part</U> shall not contain a nested <FONT FACE="Arial, Helvetica">generic_declaration</FONT>;
</LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>12.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Reason: </B>This is disallowed
because the body of the nested generic would presumably have access to
data inside the body of the RCI package, and if instantiated in a different
partition, remote data access might result, which is not supported. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>13/1</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC>{<I><A HREF="defect1.html#8652/0078">8652/0078</A></I>}
it shall not <U>be, nor shall its visible part</U> contain<U>,</U> the
declaration of a subprogram to which a pragma Inline applies;</LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>14/1</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC>{<I><A HREF="defect1.html#8652/0078">8652/0078</A></I>}
it shall not <U>be, nor shall its visible part</U> contain<U>,</U> a
subprogram (or access-to-subprogram) declaration whose profile has an
access parameter, or a formal parameter of a limited type unless that
limited type has user-specified Read and Write attributes;</LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>15</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC>any public child of the library unit shall be a remote
call interface library unit. </LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>15.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Reason: </B>No restrictions
apply to the private part of an RCI package, and since a public child
can ``see'' the private part of its parent, such a child must itself
have a Remote_Call_Interface pragma, and be assigned to the same partition
(see below). </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>15.b</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Discussion: </B>We considered
making the public child of an RCI package implicitly RCI, but it seemed
better to require an explicit pragma to avoid any confusion.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>15.c</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>Note that there is no need for
a private child to be an RCI package, since it can only be seen from
the body of its parent or its siblings, all of which are required to
be in the same active partition. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>16</FONT></DIV>
<DIV Class="Normal"> If a pragma All_Calls_Remote applies to a library
unit, the library unit shall be a remote call interface. </DIV>
<H4 ALIGN=CENTER>Post-Compilation Rules</H4>
<DIV Class="Paranum"><FONT SIZE=-2>17</FONT></DIV>
<DIV Class="Normal"> A remote call interface library unit shall be
assigned to at most one partition of a given program. A remote call interface
library unit whose parent is also an RCI library unit shall be assigned
only to the same partition as its parent. </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>17.a/1</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Implementation Note: </B>{<I><A HREF="defect1.html#8652/0078">8652/0078</A></I>}
The declaration of an RCI <U>unit</U><S>package</S>, with a calling-stub
body, is automatically included in all active partitions with compilation
units that depend on it. However the whole RCI library unit, including
its (non-stub) body, will only be in one of the active partitions. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>18</FONT></DIV>
<DIV Class="Normal"> <A NAME="I7001"></A><A NAME="I7002"></A><A NAME="I7003"></A>Notwithstanding
the rule given in <A HREF="AA-10-2.html">10.2</A>, a compilation unit
in a given partition that semantically depends on the declaration of
an RCI library unit, <I>needs</I> (in the sense of <A HREF="AA-10-2.html">10.2</A>)
only the declaration of the RCI library unit, not the body, to be included
in that same partition. [Therefore, the body of an RCI library unit is
included only in the partition to which the RCI library unit is explicitly
assigned.]</DIV>
<H4 ALIGN=CENTER>Implementation Requirements</H4>
<DIV Class="Paranum"><FONT SIZE=-2>19/1</FONT></DIV>
<DIV Class="Normal"> {<I><A HREF="defect1.html#8652/0078">8652/0078</A></I>}
If a pragma All_Calls_Remote applies to a given RCI library <U>unit</U><S>package</S>,
then the implementation shall route any call to a subprogram of the RCI
<U>unit</U><S>package</S> from outside the declarative region of the
<U>unit</U><S>package</S> through the Partition Communication Subsystem
(PCS); see <A HREF="AA-E-5.html">E.5</A>. Calls to such subprograms from
within the declarative region of the <U>unit</U><S>package</S> are defined
to be local and shall not go through the PCS. </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>19.a/1</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Discussion: </B>{<I><A HREF="defect1.html#8652/0078">8652/0078</A></I>}
Without this pragma, it is presumed that most implementations will make
direct calls if the call originates in the same partition as that of
the RCI <U>unit</U><S>package</S>. With this pragma, all calls from outside
the subsystem rooted at the RCI <U>unit</U><S>package</S> are treated
like calls from outside the partition, ensuring that the PCS is involved
in all such calls (for debugging, redundancy, etc.). </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>19.b</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Reason: </B>There is no point
to force local calls (or calls from children) to go through the PCS,
since on the target system, these calls are always local, and all the
units are in the same active partition. </FONT></DIV>
<H4 ALIGN=CENTER>Implementation Permissions</H4>
<DIV Class="Paranum"><FONT SIZE=-2>20</FONT></DIV>
<DIV Class="Normal"> An implementation need not support the Remote_Call_Interface
pragma nor the All_Calls_Remote pragma. [Explicit message-based communication
between active partitions can be supported as an alternative to RPC.]
</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>20.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>Of course,
it is pointless to support the All_Calls_Remote pragma if the Remote_Call_Interface
pragma (or some approximate equivalent) is not supported. </FONT></DIV>
<HR>
<P><A HREF="AA-TOC.html">Contents</A> <A HREF="AA-0-29.html">Index</A> <A HREF="AA-E-2-2.html">Previous</A> <A HREF="AA-E-3.html">Next</A> <A HREF="AA-TTL.html">Legal</A></P>
</BODY>
</HTML>
|