aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/ada/acats/tests/c9/c974012.a
blob: 4e43c72a842ffe4072b4544e406de478968aaf9d (plain)
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
-- C974012.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 call on a protected
--      entry which is queued.
--
-- TEST DESCRIPTION:
--      A fraction of in-line code is simulated.  A voltage deficiency causes
--      the routine to seek an alternate best-cost route on an electrical grid
--      system.  
--      
--      An asynchronous select is used with the triggering alternative being a
--      call to a protected entry with a barrier.  The abortable part is a
--      routine simulating the lengthy alternate path negotiation.  The entry
--      barrier would be cleared if the voltage deficiency is rectified before
--      the alternate can be found thus nullifying the need for the alternate.  
--      
--      The test simulates a return to normal in the middle of the
--      negotiation.  The barrier is cleared, the triggering alternative
--      completes first and the abortable part should be aborted.
--
--
-- CHANGE HISTORY:
--      06 Dec 94   SAIC    ACVC 2.0
--
--!


with Report;
with ImpDef;

procedure C974012 is

   subtype Grid_Path is string(1..21);
   subtype Deficiency is integer range 100..1_000;   -- in MWh

   New_Path         : Grid_Path;
   Dummy_Deficiency : Deficiency := 520;   
   Path_Available   : Boolean    := false;

   TC_Terminate_Negotiation_Executed  : Boolean := false;
   TC_Trigger_Completed               : Boolean := false;
   TC_Negotiation_Completed           : Boolean := false;

   protected Local_Deficit is
      procedure Set_Good_Voltage;
      procedure Bad_Voltage;
      entry Terminate_Negotiation;
   private
      Good_Voltage   : Boolean := false;   -- barrier
   end Local_Deficit;

   protected body Local_Deficit is

      procedure Set_Good_Voltage is
      begin
         Good_Voltage := true;
      end Set_Good_Voltage;

      procedure Bad_Voltage is
      begin
         Good_Voltage := false;
      end Bad_Voltage;

      -- Trigger is queued on this entry with barrier condition
      entry Terminate_Negotiation when Good_Voltage is
      begin
         -- complete the triggering call thus terminating grid_path
         -- negotiation.
         null; --::: stub - signal main board
         TC_Terminate_Negotiation_Executed := true;   -- show path traversal
      end Terminate_Negotiation;

   end Local_Deficit;


   -- Routine to find the most cost effective grid path for this 
   -- particular deficiency at this particular time
   --
   procedure Path_Negotiation (Requirement : in  Deficiency;
                               Best_Path   : out Grid_Path  ) is
      
      Dummy_Path : Grid_Path := "NYC.425_NY.227_NH.132";
      Match : Deficiency := Report.Ident_Int (Requirement); 
  
   begin
      -- 
      null; --::: stub
      --
      -- Simulate a lengthy path negotiation 
      for i in 1..5 loop
         delay ImpDef.Minimum_Task_Switch;   
         -- Part of the way through the negotiation simulate some external 
         -- event returning the voltage to acceptable level 
         if i = 3 then
            Local_Deficit.Set_Good_Voltage;   -- clear the barrier
         end if;
      end loop; 
      
      Best_Path := Dummy_Path;
      TC_Negotiation_Completed := true;
   
   end Path_Negotiation;

  

begin

   Report.Test ("C974012", "Asynchronous Select: Trigger is queued on a " &
                           "protected entry and completes before the " &
                           "abortable part");

   -- :::::::::   Fragment of code
   
   Local_Deficit.Bad_Voltage;      -- Set barrier condition

   -- For the given voltage deficiency start negotiating the best grid
   -- path.  If voltage returns to acceptable level cancel the negotiation
   --
   select
      -- Prepare to terminate the Path_Negotiation if voltage improves
      Local_Deficit.Terminate_Negotiation;
      TC_Trigger_Completed := true;
   then abort
      Path_Negotiation (Dummy_Deficiency, New_Path) ;
      Path_Available := true;
   end select;
   -- :::::::::

   if not TC_Terminate_Negotiation_Executed or else not
                                               TC_Trigger_Completed then 
      Report.Failed ("Unexpected test path taken");
   end if;

   if Path_Available or else TC_Negotiation_Completed then
      Report.Failed ("Abortable part was not aborted");
   end if;
   Report.Result;

end C974012;