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
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<HEAD>
<TITLE>AARM95 - Task Dependence - Termination of Tasks</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-9-2.html">Previous</A> <A HREF="AA-9-4.html">Next</A></P>
<HR>
<H1> 9.3 Task Dependence - Termination of Tasks</H1>
<H4 ALIGN=CENTER>Dynamic Semantics</H4>
<DIV Class="Paranum"><FONT SIZE=-2>1</FONT></DIV>
<DIV Class="Normal" Style="margin-bottom: 0.4em"> <A NAME="I3521"></A><A NAME="I3522"></A><A NAME="I3523"></A><A NAME="I3524"></A>Each
task (other than an environment task -- see <A HREF="AA-10-2.html">10.2</A>)
<I>depends</I> on one or more masters (see <A HREF="AA-7-6-1.html">7.6.1</A>),
as follows: </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>2</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC>If the task is created by the evaluation of an <FONT FACE="Arial, Helvetica">allocator</FONT>
for a given access type, it depends on each master that includes the
elaboration of the declaration of the ultimate ancestor of the given
access type.</LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>3</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC>If the task is created by the elaboration of an <FONT FACE="Arial, Helvetica">object_declaration</FONT>,
it depends on each master that includes this elaboration. </LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>4</FONT></DIV>
<DIV Class="Normal"> <A NAME="I3525"></A>Furthermore, if a task depends
on a given master, it is defined to depend on the task that executes
the master, and (recursively) on any master of that task. </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>4.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Discussion: </B>Don't confuse
these kinds of dependences with the dependences among compilation units
defined in <A HREF="AA-10-1-1.html">10.1.1</A>, ``<A HREF="AA-10-1-1.html">Compilation
Units - Library Units</A>''. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>5</FONT></DIV>
<DIV Class="Normal"> A task is said to be <I>completed</I> when the
execution of its corresponding <FONT FACE="Arial, Helvetica">task_body</FONT>
is completed. A task is said to be <I>terminated</I> when any finalization
of the <FONT FACE="Arial, Helvetica">task_body</FONT> has been performed
(see <A HREF="AA-7-6-1.html">7.6.1</A>). [The first step of finalizing
a master (including a <FONT FACE="Arial, Helvetica">task_body</FONT>)
is to wait for the termination of any tasks dependent on the master.]
<A NAME="I3526"></A>The task executing the master is blocked until all
the dependents have terminated. [Any remaining finalization is then performed
and the master is left.]</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>6/1</FONT></DIV>
<DIV Class="Normal" Style="margin-bottom: 0.4em"> Completion of
a task (and the corresponding <FONT FACE="Arial, Helvetica">task_body</FONT>)
can occur when the task is blocked at a <FONT FACE="Arial, Helvetica">select_statement</FONT>
with an <S>an </S>open <FONT FACE="Arial, Helvetica">terminate_alternative</FONT>
(see <A HREF="AA-9-7-1.html">9.7.1</A>); the open <FONT FACE="Arial, Helvetica">terminate_alternative</FONT>
is selected if and only if the following conditions are satisfied: </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>7</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC>The task depends on some completed master;</LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>8</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC>Each task that depends on the master considered is either
already terminated or similarly blocked at a <FONT FACE="Arial, Helvetica">select_statement</FONT>
with an open <FONT FACE="Arial, Helvetica">terminate_alternative</FONT>.
</LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>9</FONT></DIV>
<DIV Class="Normal"> When both conditions are satisfied, the task considered
becomes completed, together with all tasks that depend on the master
considered that are not yet completed. </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>9.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>Any required
finalization is performed after the selection of <FONT FACE="Arial, Helvetica">terminate_alternative</FONT>s.
The tasks are not callable during the finalization. In some ways it is
as though they were aborted. </FONT></DIV>
<DIV Class="NotesHeader"><FONT SIZE=-1>NOTES</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>10</FONT></DIV>
<DIV Class="Notes"><FONT SIZE=-1>8 The full view of a limited
private type can be a task type, or can have subcomponents of a task
type. Creation of an object of such a type creates dependences according
to the full type.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>11</FONT></DIV>
<DIV Class="Notes"><FONT SIZE=-1>9 An <FONT FACE="Arial, Helvetica">object_renaming_declaration</FONT>
defines a new view of an existing entity and hence creates no further
dependence.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>12</FONT></DIV>
<DIV Class="Notes"><FONT SIZE=-1>10 The rules given for the
collective completion of a group of tasks all blocked on <FONT FACE="Arial, Helvetica">select_statement</FONT>s
with open <FONT FACE="Arial, Helvetica">terminate_alternative</FONT>s
ensure that the collective completion can occur only when there are no
remaining active tasks that could call one of the tasks being collectively
completed.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>13</FONT></DIV>
<DIV Class="Notes"><FONT SIZE=-1>11 If two or more tasks are
blocked on <FONT FACE="Arial, Helvetica">select_statement</FONT>s with
open <FONT FACE="Arial, Helvetica">terminate_alternative</FONT>s, and
become completed collectively, their finalization actions proceed concurrently.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>14</FONT></DIV>
<DIV Class="Notes" Style="margin-bottom: 0.4em"><FONT SIZE=-1>12 The
completion of a task can occur due to any of the following: </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>15</FONT></DIV>
<UL Class="NotesBulleted"><FONT SIZE=-1><LI TYPE=DISC>the raising of an exception during the elaboration of the
<FONT FACE="Arial, Helvetica">declarative_part</FONT> of the corresponding
<FONT FACE="Arial, Helvetica">task_body</FONT>;</LI></FONT></UL>
<DIV Class="Paranum"><FONT SIZE=-2>16</FONT></DIV>
<UL Class="NotesBulleted"><FONT SIZE=-1><LI TYPE=DISC>the completion of the <FONT FACE="Arial, Helvetica">handled_sequence_of_statements</FONT>
of the corresponding <FONT FACE="Arial, Helvetica">task_body</FONT>;</LI></FONT></UL>
<DIV Class="Paranum"><FONT SIZE=-2>17</FONT></DIV>
<UL Class="NotesBulleted"><FONT SIZE=-1><LI TYPE=DISC>the selection of an open <FONT FACE="Arial, Helvetica">terminate_alternative</FONT>
of a <FONT FACE="Arial, Helvetica">select_statement</FONT> in the corresponding
<FONT FACE="Arial, Helvetica">task_body</FONT>;</LI></FONT></UL>
<DIV Class="Paranum"><FONT SIZE=-2>18</FONT></DIV>
<UL Class="NotesBulleted"><FONT SIZE=-1><LI TYPE=DISC>the abort of the task. </LI></FONT></UL>
<H4 ALIGN=CENTER>Examples</H4>
<DIV Class="Paranum"><FONT SIZE=-2>19</FONT></DIV>
<DIV Class="Normal" Style="margin-bottom: 0.4em"> <I>Example of task
dependence:</I> </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>20</FONT></DIV>
<DIV Class="Examples"><TT><B>declare</B><BR>
<B>type</B> Global <B>is</B> <B>access</B> Server; <I>-- see <A HREF="AA-9-1.html">9.1</A></I><BR>
A, B : Server;<BR>
G : Global;<BR>
<B>begin</B><BR>
<I>-- activation of A and B</I><BR>
<B>declare</B><BR>
<B>type</B> Local <B>is</B> <B>access</B> Server;<BR>
X : Global := <B>new</B> Server; <I>-- activation of X.<B>all</B></I><BR>
L : Local := <B>new</B> Server; <I>-- activation of L.<B>all</B></I><BR>
C : Server;<BR>
<B>begin</B><BR>
<I>-- activation of C</I><BR>
G := X; <I>-- both G and X designate the same task object</I><BR>
...<BR>
<B>end;</B> <I>-- await termination of C and L.<B>all</B> (but not X.<B>all</B>)</I><BR>
...<BR>
<B>end;</B> <I>-- await termination of A, B, and G.<B>all</B></I></TT></DIV>
<H4 ALIGN=CENTER>Wording Changes from Ada 83</H4>
<DIV Class="Paranum"><FONT SIZE=-2>20.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>We have revised the wording to
be consistent with the definition of master now given in <A HREF="AA-7-6-1.html">7.6.1</A>,
``<A HREF="AA-7-6-1.html">Completion and Finalization</A>''.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>20.b</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>Tasks that used to depend on library
packages in Ada 83, now depend on the (implicit) <FONT FACE="Arial, Helvetica">task_body</FONT>
of the environment task (see <A HREF="AA-10-2.html">10.2</A>). Therefore,
the environment task has to wait for them before performing library level
finalization and terminating the partition. In Ada 83 the requirement
to wait for tasks that depended on library packages was not as clear.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>20.c</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>What was "collective termination"
is now "collective completion" resulting from selecting <FONT FACE="Arial, Helvetica">terminate_alternative</FONT>s.
This is because finalization still occurs for such tasks, and this happens
after selecting the <FONT FACE="Arial, Helvetica">terminate_alternative</FONT>,
but before termination. </FONT></DIV>
<HR>
<P><A HREF="AA-TOC.html">Contents</A> <A HREF="AA-0-29.html">Index</A> <A HREF="AA-9-2.html">Previous</A> <A HREF="AA-9-4.html">Next</A> <A HREF="AA-TTL.html">Legal</A></P>
</BODY>
</HTML>
|