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> <A HREF="RM-0-29.html">Index</A> <A HREF="RM-E-4-1.html">Previous</A> <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"> <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> Tapes <B>is</B><BR>
<B>pragma</B> Pure(Tapes);<BR>
<B>type</B> Tape <B>is abstract tagged limited private</B>;<BR>
<I>-- Primitive dispatching operations where</I><BR>
<I>-- Tape is controlling operand</I><BR>
<B>procedure</B> Copy (From, To : <B>access</B> Tape; Num_Recs : <B>in</B> Natural) <B>is</B> <B>abstract</B>;<BR>
<B>procedure</B> Rewind (T : <B>access</B> Tape) <B>is</B> <B>abstract</B>;<BR>
<I>-- More operations</I><BR>
<B>private</B><BR>
<B>type</B> Tape <B>is</B> ...<BR>
<B>end</B> Tapes;</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>3</FONT></DIV>
<DIV Class="Examples"><TT><B>with</B> Tapes;<BR>
<B>package</B> Name_Server <B>is</B><BR>
<B>pragma</B> Remote_Call_Interface;<BR>
<I>-- Dynamic binding to remote operations is achieved</I><BR>
<I>-- using the access-to-limited-class-wide type Tape_Ptr</I><BR>
<B>type</B> Tape_Ptr <B>is access all</B> Tapes.Tape'Class;<BR>
<I>-- The following statically bound remote operations</I><BR>
<I>-- allow for a name-server capability in this example</I><BR>
<B>function</B> Find (Name : String) <B>return</B> Tape_Ptr;<BR>
<B>procedure</B> Register (Name : <B>in</B> String; T : <B>in</B> Tape_Ptr);<BR>
<B>procedure</B> Remove (T : <B>in</B> Tape_Ptr);<BR>
<I>-- More operations</I><BR>
<B>end</B> Name_Server;</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>4</FONT></DIV>
<DIV Class="Examples"><TT><B>package</B> Tape_Driver <B>is</B><BR>
<I>-- Declarations are not shown, they are irrelevant here</I><BR>
<B>end</B> Tape_Driver;</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>5</FONT></DIV>
<DIV Class="Examples"><TT><B>with</B> Tapes, Name_Server;<BR>
<B>package body</B> Tape_Driver <B>is</B><BR>
<B>type</B> New_Tape <B>is new</B> Tapes.Tape <B>with</B> ...<BR>
<B>procedure</B> Copy<BR>
(From, To : <B>access</B> New_Tape; Num_Recs: <B>in</B> Natural) <B>is</B><BR>
<B>begin</B><BR>
. . .<BR>
<B>end</B> Copy;<BR>
<B>procedure</B> Rewind (T : <B>access</B> New_Tape) <B>is</B><BR>
<B>begin</B><BR>
. . .<BR>
<B>end</B> Rewind;<BR>
<I>-- Objects remotely accessible through use</I><BR>
<I>-- of Name_Server operations</I><BR>
Tape1, Tape2 : <B>aliased</B> New_Tape;<BR>
<B>begin</B><BR>
Name_Server.Register ("NINE-TRACK", Tape1'Access);<BR>
Name_Server.Register ("SEVEN-TRACK", Tape2'Access);<BR>
<B>end</B> Tape_Driver;</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>6</FONT></DIV>
<DIV Class="Examples"><TT><B>with</B> Tapes, Name_Server;<BR>
<I>-- Tape_Driver is not needed and thus not mentioned in the <FONT FACE="Arial, Helvetica">with_clause</FONT></I><BR>
<B>procedure</B> Tape_Client <B>is</B><BR>
T1, T2 : Name_Server.Tape_Ptr;<BR>
<B>begin</B><BR>
T1 := Name_Server.Find ("NINE-TRACK");<BR>
T2 := Name_Server.Find ("SEVEN-TRACK");<BR>
Tapes.Rewind (T1);<BR>
Tapes.Rewind (T2);<BR>
Tapes.Copy (T1, T2, 3);<BR>
<B>end</B> Tape_Client;</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>7</FONT></DIV>
<DIV Class="Normal" Style="margin-bottom: 0.4em"> <I>Notes on the
example</I>: </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>8/1</FONT></DIV>
<DIV Class="Normal"> <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> <A HREF="RM-0-29.html">Index</A> <A HREF="RM-E-4-1.html">Previous</A> <A HREF="RM-E-5.html">Next</A> <A HREF="RM-TTL.html">Legal</A></P>
</BODY>
</HTML>
|