111
|
1 -- C951001.A
|
|
2 --
|
|
3 -- Grant of Unlimited Rights
|
|
4 --
|
|
5 -- Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687,
|
|
6 -- F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained
|
|
7 -- unlimited rights in the software and documentation contained herein.
|
|
8 -- Unlimited rights are defined in DFAR 252.227-7013(a)(19). By making
|
|
9 -- this public release, the Government intends to confer upon all
|
|
10 -- recipients unlimited rights equal to those held by the Government.
|
|
11 -- These rights include rights to use, duplicate, release or disclose the
|
|
12 -- released technical data and computer software in whole or in part, in
|
|
13 -- any manner and for any purpose whatsoever, and to have or permit others
|
|
14 -- to do so.
|
|
15 --
|
|
16 -- DISCLAIMER
|
|
17 --
|
|
18 -- ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR
|
|
19 -- DISCLOSED ARE AS IS. THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED
|
|
20 -- WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE
|
|
21 -- SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE
|
|
22 -- OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A
|
|
23 -- PARTICULAR PURPOSE OF SAID MATERIAL.
|
|
24 --*
|
|
25 --
|
|
26 -- OBJECTIVE:
|
|
27 -- Check that two procedures in a protected object will not be
|
|
28 -- executed concurrently.
|
|
29 --
|
|
30 -- TEST DESCRIPTION:
|
|
31 -- A very simple example of two tasks calling two procedures in the same
|
|
32 -- protected object is used. Test control code has been added to the
|
|
33 -- procedures such that, whichever gets called first executes a lengthy
|
|
34 -- calculation giving sufficient time (on a multiprocessor or a
|
|
35 -- time-slicing machine) for the other task to get control and call the
|
|
36 -- other procedure. The control code verifies that entry to the second
|
|
37 -- routine is postponed until the first is complete.
|
|
38 --
|
|
39 --
|
|
40 -- CHANGE HISTORY:
|
|
41 -- 06 Dec 94 SAIC ACVC 2.0
|
|
42 --
|
|
43 --!
|
|
44
|
|
45 with Report;
|
|
46 with ImpDef;
|
|
47
|
|
48 procedure C951001 is
|
|
49
|
|
50 protected Ramp_31 is
|
|
51
|
|
52 procedure Add_Meter_Queue;
|
|
53 procedure Subtract_Meter_Queue;
|
|
54 function TC_Failed return Boolean;
|
|
55
|
|
56 private
|
|
57
|
|
58 Ramp_Count : integer range 0..20 := 4; -- Start test with some
|
|
59 -- vehicles on the ramp
|
|
60
|
|
61 TC_Add_Started : Boolean := false;
|
|
62 TC_Subtract_Started : Boolean := false;
|
|
63 TC_Add_Finished : Boolean := false;
|
|
64 TC_Subtract_Finished : Boolean := false;
|
|
65 TC_Concurrent_Running: Boolean := false;
|
|
66
|
|
67 end Ramp_31;
|
|
68
|
|
69
|
|
70 protected body Ramp_31 is
|
|
71
|
|
72 function TC_Failed return Boolean is
|
|
73 begin
|
|
74 -- this indicator will have been set true if any instance
|
|
75 -- of concurrent running has been proved
|
|
76 return TC_Concurrent_Running;
|
|
77 end TC_Failed;
|
|
78
|
|
79
|
|
80 procedure Add_Meter_Queue is
|
|
81 begin
|
|
82 --==================================================
|
|
83 -- This section is all Test_Control code
|
|
84 TC_Add_Started := true;
|
|
85 if TC_Subtract_Started then
|
|
86 if not TC_Subtract_Finished then
|
|
87 TC_Concurrent_Running := true;
|
|
88 end if;
|
|
89 else
|
|
90 -- Subtract has not started.
|
|
91 -- Execute a lengthy routine to give it a chance to do so
|
|
92 ImpDef.Exceed_Time_Slice;
|
|
93
|
|
94 if TC_Subtract_Started then
|
|
95 -- Subtract was able to start so we have concurrent
|
|
96 -- running and the test has failed
|
|
97 TC_Concurrent_Running := true;
|
|
98 end if;
|
|
99 end if;
|
|
100 TC_Add_Finished := true;
|
|
101 --==================================================
|
|
102 Ramp_Count := Ramp_Count + 1;
|
|
103 end Add_Meter_Queue;
|
|
104
|
|
105 procedure Subtract_Meter_Queue is
|
|
106 begin
|
|
107 --==================================================
|
|
108 -- This section is all Test_Control code
|
|
109 TC_Subtract_Started := true;
|
|
110 if TC_Add_Started then
|
|
111 if not TC_Add_Finished then
|
|
112 -- We already have concurrent running
|
|
113 TC_Concurrent_Running := true;
|
|
114 end if;
|
|
115 else
|
|
116 -- Add has not started.
|
|
117 -- Execute a lengthy routine to give it a chance to do so
|
|
118 ImpDef.Exceed_Time_Slice;
|
|
119
|
|
120 if TC_Add_Started then
|
|
121 -- Add was able to start so we have concurrent
|
|
122 -- running and the test has failed
|
|
123 TC_Concurrent_Running := true;
|
|
124 end if;
|
|
125 end if;
|
|
126 TC_Subtract_Finished := true;
|
|
127 --==================================================
|
|
128 Ramp_Count := Ramp_Count - 1;
|
|
129 end Subtract_Meter_Queue;
|
|
130
|
|
131 end Ramp_31;
|
|
132
|
|
133 begin
|
|
134
|
|
135 Report.Test ("C951001", "Check that two procedures in a protected" &
|
|
136 " object will not be executed concurrently");
|
|
137
|
|
138 declare -- encapsulate the test
|
|
139
|
|
140 task Vehicle_1;
|
|
141 task Vehicle_2;
|
|
142
|
|
143
|
|
144 -- Vehicle_1 and Vehicle_2 are simulations of Instances of the task
|
|
145 -- of type Vehicle in different stages of execution
|
|
146
|
|
147 task body Vehicle_1 is
|
|
148 begin
|
|
149 null; -- ::::: stub. preparation code
|
|
150
|
|
151 -- Add to the count of vehicles on the queue
|
|
152 Ramp_31.Add_Meter_Queue;
|
|
153
|
|
154 null; -- ::::: stub: wait at the meter then pass to first sensor
|
|
155
|
|
156 -- Reduce the count of vehicles on the queue
|
|
157 null; -- ::::: stub: Ramp_31.Subtract_Meter_Queue
|
|
158 exception
|
|
159 when others =>
|
|
160 Report.Failed ("Unexpected Exception in Vehicle_1 task");
|
|
161 end Vehicle_1;
|
|
162
|
|
163
|
|
164 task body Vehicle_2 is
|
|
165 begin
|
|
166 null; -- ::::: stub. preparation code
|
|
167
|
|
168 -- Add to the count of vehicles on the queue
|
|
169 null; -- ::::: stub Ramp_31.Add_Meter_Queue;
|
|
170
|
|
171 null; -- ::::: stub: wait at the meter then pass to first sensor
|
|
172
|
|
173 -- Reduce the count of vehicles on the queue
|
|
174 Ramp_31.Subtract_Meter_Queue;
|
|
175 exception
|
|
176 when others =>
|
|
177 Report.Failed ("Unexpected Exception in Vehicle_2 task");
|
|
178 end Vehicle_2;
|
|
179
|
|
180
|
|
181
|
|
182 begin
|
|
183 null;
|
|
184 end; -- encapsulation
|
|
185
|
|
186 if Ramp_31.TC_Failed then
|
|
187 Report.Failed ("Concurrent Running detected");
|
|
188 end if;
|
|
189
|
|
190 Report.Result;
|
|
191
|
|
192 end C951001;
|