File: RM-E-4-2.html

package info (click to toggle)
ada-reference-manual 20021112web-3
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k, lenny, sarge
  • size: 18,652 kB
  • ctags: 8,921
  • sloc: makefile: 52; sh: 20
file content (167 lines) | stat: -rw-r--r-- 13,327 bytes parent folder | download
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
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<HEAD>
    <TITLE>Ada95 - Example of Use of a Remote Access-to-Class-Wide Type</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="RM-TOC.html">Contents</A>&nbsp;&nbsp;&nbsp;<A HREF="RM-0-29.html">Index</A>&nbsp;&nbsp;&nbsp;<A HREF="RM-E-4-1.html">Previous</A>&nbsp;&nbsp;&nbsp;<A HREF="RM-E-5.html">Next</A></P>
<HR>
<H1> E.4.2 Example of Use of a Remote Access-to-Class-Wide Type</H1>

<H4 ALIGN=CENTER>Examples</H4>
<DIV Class="Paranum"><FONT SIZE=-2>1</FONT></DIV>
<DIV Class="Normal" Style="margin-bottom: 0.4em">&nbsp;&nbsp;&nbsp;<I>Example of using
a remote access-to-class-wide type to achieve dynamic binding across
active partitions:</I> </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>2</FONT></DIV>
<DIV Class="Examples"><TT><B>package</B>&nbsp;Tapes&nbsp;<B>is</B><BR>
&nbsp;&nbsp;&nbsp;<B>pragma</B>&nbsp;Pure(Tapes);<BR>
&nbsp;&nbsp;&nbsp;<B>type</B>&nbsp;Tape&nbsp;<B>is&nbsp;abstract&nbsp;tagged&nbsp;limited&nbsp;private</B>;<BR>
&nbsp;&nbsp;&nbsp;<I>--&nbsp;Primitive&nbsp;dispatching&nbsp;operations&nbsp;where</I><BR>
&nbsp;&nbsp;&nbsp;<I>--&nbsp;Tape&nbsp;is&nbsp;controlling&nbsp;operand</I><BR>
&nbsp;&nbsp;&nbsp;<B>procedure</B>&nbsp;Copy&nbsp;(From,&nbsp;To&nbsp;:&nbsp;<B>access</B>&nbsp;Tape;&nbsp;Num_Recs&nbsp;:&nbsp;<B>in</B>&nbsp;Natural)&nbsp;<B>is</B>&nbsp;<B>abstract</B>;<BR>
&nbsp;&nbsp;&nbsp;<B>procedure</B>&nbsp;Rewind&nbsp;(T&nbsp;:&nbsp;<B>access</B>&nbsp;Tape)&nbsp;<B>is</B>&nbsp;<B>abstract</B>;<BR>
&nbsp;&nbsp;&nbsp;<I>--&nbsp;More&nbsp;operations</I><BR>
<B>private</B><BR>
&nbsp;&nbsp;&nbsp;<B>type</B>&nbsp;Tape&nbsp;<B>is</B>&nbsp;...<BR>
<B>end</B>&nbsp;Tapes;</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>3</FONT></DIV>
<DIV Class="Examples"><TT><B>with</B>&nbsp;Tapes;<BR>
<B>package</B>&nbsp;Name_Server&nbsp;<B>is</B><BR>
&nbsp;&nbsp;&nbsp;<B>pragma</B>&nbsp;Remote_Call_Interface;<BR>
&nbsp;&nbsp;&nbsp;<I>--&nbsp;Dynamic&nbsp;binding&nbsp;to&nbsp;remote&nbsp;operations&nbsp;is&nbsp;achieved</I><BR>
&nbsp;&nbsp;&nbsp;<I>--&nbsp;using&nbsp;the&nbsp;access-to-limited-class-wide&nbsp;type&nbsp;Tape_Ptr</I><BR>
&nbsp;&nbsp;&nbsp;<B>type</B>&nbsp;Tape_Ptr&nbsp;<B>is&nbsp;access&nbsp;all</B>&nbsp;Tapes.Tape'Class;<BR>
&nbsp;&nbsp;&nbsp;<I>--&nbsp;The&nbsp;following&nbsp;statically&nbsp;bound&nbsp;remote&nbsp;operations</I><BR>
&nbsp;&nbsp;&nbsp;<I>--&nbsp;allow&nbsp;for&nbsp;a&nbsp;name-server&nbsp;capability&nbsp;in&nbsp;this&nbsp;example</I><BR>
&nbsp;&nbsp;&nbsp;<B>function</B>&nbsp;&nbsp;Find&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(Name&nbsp;:&nbsp;String)&nbsp;<B>return</B>&nbsp;Tape_Ptr;<BR>
&nbsp;&nbsp;&nbsp;<B>procedure</B>&nbsp;Register&nbsp;(Name&nbsp;:&nbsp;<B>in</B>&nbsp;String;&nbsp;T&nbsp;:&nbsp;<B>in</B>&nbsp;Tape_Ptr);<BR>
&nbsp;&nbsp;&nbsp;<B>procedure</B>&nbsp;Remove&nbsp;&nbsp;&nbsp;(T&nbsp;:&nbsp;<B>in</B>&nbsp;Tape_Ptr);<BR>
&nbsp;&nbsp;&nbsp;<I>--&nbsp;More&nbsp;operations</I><BR>
<B>end</B>&nbsp;Name_Server;</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>4</FONT></DIV>
<DIV Class="Examples"><TT><B>package</B>&nbsp;Tape_Driver&nbsp;<B>is</B><BR>
&nbsp;&nbsp;<I>--&nbsp;Declarations&nbsp;are&nbsp;not&nbsp;shown,&nbsp;they&nbsp;are&nbsp;irrelevant&nbsp;here</I><BR>
<B>end</B>&nbsp;Tape_Driver;</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>5</FONT></DIV>
<DIV Class="Examples"><TT><B>with</B>&nbsp;Tapes,&nbsp;Name_Server;<BR>
<B>package&nbsp;body</B>&nbsp;Tape_Driver&nbsp;<B>is</B><BR>
&nbsp;&nbsp;&nbsp;<B>type</B>&nbsp;New_Tape&nbsp;<B>is&nbsp;new</B>&nbsp;Tapes.Tape&nbsp;<B>with</B>&nbsp;...<BR>
&nbsp;&nbsp;&nbsp;<B>procedure</B>&nbsp;Copy<BR>
&nbsp;&nbsp;&nbsp;&nbsp;(From,&nbsp;To&nbsp;:&nbsp;<B>access</B>&nbsp;New_Tape;&nbsp;Num_Recs:&nbsp;<B>in</B>&nbsp;Natural)&nbsp;<B>is</B><BR>
&nbsp;&nbsp;&nbsp;<B>begin</B><BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;.&nbsp;.<BR>
&nbsp;&nbsp;&nbsp;<B>end</B>&nbsp;Copy;<BR>
&nbsp;&nbsp;&nbsp;<B>procedure</B>&nbsp;Rewind&nbsp;(T&nbsp;:&nbsp;<B>access</B>&nbsp;New_Tape)&nbsp;<B>is</B><BR>
&nbsp;&nbsp;&nbsp;<B>begin</B><BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;.&nbsp;.<BR>
&nbsp;&nbsp;&nbsp;<B>end</B>&nbsp;Rewind;<BR>
&nbsp;&nbsp;&nbsp;<I>--&nbsp;Objects&nbsp;remotely&nbsp;accessible&nbsp;through&nbsp;use</I><BR>
&nbsp;&nbsp;&nbsp;<I>--&nbsp;of&nbsp;Name_Server&nbsp;operations</I><BR>
&nbsp;&nbsp;&nbsp;Tape1,&nbsp;Tape2&nbsp;:&nbsp;<B>aliased</B>&nbsp;New_Tape;<BR>
<B>begin</B><BR>
&nbsp;&nbsp;&nbsp;Name_Server.Register&nbsp;(&quot;NINE-TRACK&quot;,&nbsp;&nbsp;Tape1'Access);<BR>
&nbsp;&nbsp;&nbsp;Name_Server.Register&nbsp;(&quot;SEVEN-TRACK&quot;,&nbsp;Tape2'Access);<BR>
<B>end</B>&nbsp;Tape_Driver;</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>6</FONT></DIV>
<DIV Class="Examples"><TT><B>with</B>&nbsp;Tapes,&nbsp;Name_Server;<BR>
<I>--&nbsp;Tape_Driver&nbsp;is&nbsp;not&nbsp;needed&nbsp;and&nbsp;thus&nbsp;not&nbsp;mentioned&nbsp;in&nbsp;the&nbsp;<FONT FACE="Arial, Helvetica">with_clause</FONT></I><BR>
<B>procedure</B>&nbsp;Tape_Client&nbsp;<B>is</B><BR>
&nbsp;&nbsp;&nbsp;T1,&nbsp;T2&nbsp;:&nbsp;Name_Server.Tape_Ptr;<BR>
<B>begin</B><BR>
&nbsp;&nbsp;&nbsp;T1&nbsp;:=&nbsp;Name_Server.Find&nbsp;(&quot;NINE-TRACK&quot;);<BR>
&nbsp;&nbsp;&nbsp;T2&nbsp;:=&nbsp;Name_Server.Find&nbsp;(&quot;SEVEN-TRACK&quot;);<BR>
&nbsp;&nbsp;&nbsp;Tapes.Rewind&nbsp;(T1);<BR>
&nbsp;&nbsp;&nbsp;Tapes.Rewind&nbsp;(T2);<BR>
&nbsp;&nbsp;&nbsp;Tapes.Copy&nbsp;(T1,&nbsp;T2,&nbsp;3);<BR>
<B>end</B>&nbsp;Tape_Client;</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>7</FONT></DIV>
<DIV Class="Normal" Style="margin-bottom: 0.4em">&nbsp;&nbsp;&nbsp;<I>Notes on the
example</I>: </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>8/1</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT SIZE=-1><I>This paragraph was deleted.</I></FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>9</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC>The package Tapes provides the necessary declarations of
the type and its primitive operations.</LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>10</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC>Name_Server is a remote call interface package and is elaborated
in a separate active partition to provide the necessary naming services
(such as Register and Find) to the entire distributed program through
remote subprogram calls.</LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>11</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC>Tape_Driver is a normal package that is elaborated in a
partition configured on the processing node that is connected to the
tape device(s). The abstract operations are overridden to support the
locally declared tape devices (Tape1, Tape2). The package is not visible
to its clients, but it exports the tape devices (as remote objects) through
the services of the Name_Server. This allows for tape devices to be dynamically
added, removed or replaced without requiring the modification of the
clients' code.</LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>12</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC>The Tape_Client procedure references only declarations
in the Tapes and Name_Server  packages. Before using a tape for the first
time, it needs to query the Name_Server for a system-wide identity for
that tape. From then on, it can use that identity to access the tape
device.</LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>13</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC>Values of remote access type Tape_Ptr include the necessary
information to complete the remote dispatching operations that result
from dereferencing the controlling operands T1 and T2.</LI></UL>

<HR>
<P><A HREF="RM-TOC.html">Contents</A>&nbsp;&nbsp;&nbsp;<A HREF="RM-0-29.html">Index</A>&nbsp;&nbsp;&nbsp;<A HREF="RM-E-4-1.html">Previous</A>&nbsp;&nbsp;&nbsp;<A HREF="RM-E-5.html">Next</A>&nbsp;&nbsp;&nbsp;<A HREF="RM-TTL.html">Legal</A></P>
</BODY>
</HTML>