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 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249
|
-- C974003.A
--
-- Grant of Unlimited Rights
--
-- Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687,
-- F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained
-- unlimited rights in the software and documentation contained herein.
-- Unlimited rights are defined in DFAR 252.227-7013(a)(19). By making
-- this public release, the Government intends to confer upon all
-- recipients unlimited rights equal to those held by the Government.
-- These rights include rights to use, duplicate, release or disclose the
-- released technical data and computer software in whole or in part, in
-- any manner and for any purpose whatsoever, and to have or permit others
-- to do so.
--
-- DISCLAIMER
--
-- ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR
-- DISCLOSED ARE AS IS. THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED
-- WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE
-- SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE
-- OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A
-- PARTICULAR PURPOSE OF SAID MATERIAL.
--*
--
-- OBJECTIVE:
-- Check that the abortable part of an asynchronous select statement
-- is aborted if it does not complete before the triggering statement
-- completes, where the triggering statement is a task entry call, and
-- the entry call is queued.
--
-- Check that the sequence of statements of the triggering alternative
-- is executed after the abortable part is left.
--
-- TEST DESCRIPTION:
-- Declare a main procedure containing an asynchronous select with a task
-- entry call as triggering statement. Force the entry call to be
-- queued by having the task call a procedure, prior to the corresponding
-- accept statement, which simulates a routine waiting for user input
-- (with a delay).
--
-- Simulate a time-consuming routine in the abortable part by calling a
-- procedure containing an infinite loop. Meanwhile, simulate input by
-- the user (the delay expires), which causes the task to execute the
-- accept statement corresponding to the triggering entry call.
--
--
-- CHANGE HISTORY:
-- 06 Dec 94 SAIC ACVC 2.0
--
--!
package C974003_0 is -- Automated teller machine abstraction.
-- Flags for testing purposes:
--
TC_Triggering_Statement_Completed : Boolean := False;
TC_Count : Integer := 1234; -- Global to defeat
-- optimization.
type Key_Enum is (None, Cancel, Deposit, Withdraw);
type Card_Number_Type is private;
type Card_PIN_Type is private;
type ATM_Card_Type is private;
Transaction_Canceled : exception;
task type ATM_Keyboard_Task is
entry Cancel_Pressed;
end ATM_Keyboard_Task;
procedure Read_Card (Card : in out ATM_Card_Type);
procedure Validate_Card (Card : in ATM_Card_Type);
procedure Perform_Transaction (Card : in ATM_Card_Type);
private
type Card_Number_Type is range 1 .. 9999;
type Card_PIN_Type is range 100 .. 999;
type ATM_Card_Type is record
Number : Card_Number_Type;
PIN : Card_PIN_Type;
end record;
end C974003_0;
--==================================================================--
with Report;
with ImpDef;
package body C974003_0 is
procedure Listen_For_Input (Key : out Key_Enum) is
begin
-- Model the situation where the user waits a bit for the card to
-- be validated, then presses cancel before it completes.
-- Delay long enough to force queuing of Keyboard.Cancel_Pressed.
delay ImpDef.Minimum_Task_Switch;
if Report.Equal (3, 3) then -- Always true.
Key := Cancel;
end if;
end Listen_For_Input;
-- One of these gets created as "Keyboard" for each transaction
--
task body ATM_Keyboard_Task is
Key_Pressed : Key_Enum := None;
begin
loop
-- Force entry calls
Listen_For_Input (Key_Pressed); -- to be queued,
-- then set guard to
-- true.
select
when (Key_Pressed = Cancel) => -- Guard is now
accept Cancel_Pressed do -- true, so accept
TC_Triggering_Statement_Completed := True; -- queued entry
end Cancel_Pressed; -- call.
-- User has cancelled the transaction so we exit the
-- loop and allow the task to terminate
exit;
else
Key_Pressed := None;
end select;
end loop;
exception
when others =>
Report.Failed ("Unexpected Exception in ATM_Keyboard_Task");
end ATM_Keyboard_Task;
procedure Read_Card (Card : in out ATM_Card_Type) is
begin
Card.Number := 9999;
Card.PIN := 111;
end Read_Card;
procedure Validate_Card (Card : in ATM_Card_Type) is
begin
-- Simulate an exceedingly long validation activity.
loop -- Infinite loop.
TC_Count := (TC_Count + 1) mod Integer (Card.PIN);
-- Synch. point to allow transfer of control to Keyboard
-- task during this simulation
delay ImpDef.Minimum_Task_Switch;
exit when not Report.Equal (TC_Count, TC_Count); -- Always false.
end loop;
end Validate_Card;
procedure Perform_Transaction (Card : in ATM_Card_Type) is
begin
Report.Failed ("Triggering alternative sequence of statements " &
"not executed");
if not TC_Triggering_Statement_Completed then
Report.Failed ("Triggering statement did not complete");
end if;
if TC_Count = 1234 then
-- Initial value is unchanged
Report.Failed ("Abortable part did not execute");
end if;
end Perform_Transaction;
end C974003_0;
--==================================================================--
with Report;
with C974003_0; -- Automated teller machine abstraction.
use C974003_0;
procedure C974003 is
Card_Data : ATM_Card_Type;
begin -- Main program.
Report.Test ("C974003", "Asynchronous Select: Trigger is queued on a " &
"task entry and completes first");
Read_Card (Card_Data);
declare
-- Create the task for this transaction
Keyboard : C974003_0.ATM_Keyboard_Task;
begin
-- --
-- Asynchronous select is tested here --
-- --
select
Keyboard.Cancel_Pressed; -- Entry call is initially queued, so
-- abortable part starts.
raise Transaction_Canceled; -- This is executed after Validate_Card
-- is aborted.
then abort
Validate_Card (Card_Data); -- Keyboard.Cancel_Pressed is accepted
-- and completes before this call
-- finishes; it is then aborted.
-- Check that the whole of the abortable part is aborted, not
-- just the statement in the abortable part that was executing
-- at the time
Report.Failed ("Abortable part not aborted");
end select;
Perform_Transaction (Card_Data); -- Should not be reached.
exception
when Transaction_Canceled =>
if not TC_Triggering_Statement_Completed then
Report.Failed ("Triggering alternative sequence of statements " &
"executed but triggering statement not complete");
end if;
if TC_Count = 1234 then
-- Initial value is unchanged
Report.Failed ("Abortable part did not execute");
end if;
end;
Report.Result;
end C974003;
|