111
|
1 ------------------------------------------------------------------------------
|
|
2 -- --
|
|
3 -- GNAT COMPILER COMPONENTS --
|
|
4 -- --
|
|
5 -- S Y S T E M . A U X _ D E C --
|
|
6 -- --
|
|
7 -- B o d y --
|
|
8 -- --
|
|
9 -- Copyright (C) 1992-2017, Free Software Foundation, Inc. --
|
|
10 -- --
|
|
11 -- GNAT is free software; you can redistribute it and/Or modify it under --
|
|
12 -- terms of the GNU General Public License as published by the Free Soft- --
|
|
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
|
|
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
|
|
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
|
|
16 -- or FITNESS FOR A PARTICULAR PURPOSE. --
|
|
17 -- --
|
|
18 -- As a special exception under Section 7 of GPL version 3, you are granted --
|
|
19 -- additional permissions described in the GCC Runtime Library Exception, --
|
|
20 -- version 3.1, as published by the Free Software Foundation. --
|
|
21 -- --
|
|
22 -- You should have received a copy of the GNU General Public License and --
|
|
23 -- a copy of the GCC Runtime Library Exception along with this program; --
|
|
24 -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
|
|
25 -- <http://www.gnu.org/licenses/>. --
|
|
26 -- --
|
|
27 -- GNAT was originally developed by the GNAT team at New York University. --
|
|
28 -- Extensive contributions were provided by Ada Core Technologies Inc. --
|
|
29 -- --
|
|
30 ------------------------------------------------------------------------------
|
|
31
|
|
32 pragma Style_Checks (All_Checks);
|
|
33 -- Turn off alpha ordering check on subprograms, this unit is laid
|
|
34 -- out to correspond to the declarations in the DEC 83 System unit.
|
|
35
|
|
36 with System.Soft_Links;
|
|
37
|
|
38 package body System.Aux_DEC is
|
|
39
|
|
40 package SSL renames System.Soft_Links;
|
|
41
|
|
42 -----------------------------------
|
|
43 -- Operations on Largest_Integer --
|
|
44 -----------------------------------
|
|
45
|
|
46 -- It would be nice to replace these with intrinsics, but that does
|
|
47 -- not work yet (the back end would be ok, but GNAT itself objects)
|
|
48
|
|
49 type LIU is mod 2 ** Largest_Integer'Size;
|
|
50 -- Unsigned type of same length as Largest_Integer
|
|
51
|
|
52 function To_LI is new Ada.Unchecked_Conversion (LIU, Largest_Integer);
|
|
53 function From_LI is new Ada.Unchecked_Conversion (Largest_Integer, LIU);
|
|
54
|
|
55 function "not" (Left : Largest_Integer) return Largest_Integer is
|
|
56 begin
|
|
57 return To_LI (not From_LI (Left));
|
|
58 end "not";
|
|
59
|
|
60 function "and" (Left, Right : Largest_Integer) return Largest_Integer is
|
|
61 begin
|
|
62 return To_LI (From_LI (Left) and From_LI (Right));
|
|
63 end "and";
|
|
64
|
|
65 function "or" (Left, Right : Largest_Integer) return Largest_Integer is
|
|
66 begin
|
|
67 return To_LI (From_LI (Left) or From_LI (Right));
|
|
68 end "or";
|
|
69
|
|
70 function "xor" (Left, Right : Largest_Integer) return Largest_Integer is
|
|
71 begin
|
|
72 return To_LI (From_LI (Left) xor From_LI (Right));
|
|
73 end "xor";
|
|
74
|
|
75 --------------------------------------
|
|
76 -- Arithmetic Operations on Address --
|
|
77 --------------------------------------
|
|
78
|
|
79 -- It would be nice to replace these with intrinsics, but that does
|
|
80 -- not work yet (the back end would be ok, but GNAT itself objects)
|
|
81
|
|
82 Asiz : constant Integer := Integer (Address'Size) - 1;
|
|
83
|
|
84 type SA is range -(2 ** Asiz) .. 2 ** Asiz - 1;
|
|
85 -- Signed type of same size as Address
|
|
86
|
|
87 function To_A is new Ada.Unchecked_Conversion (SA, Address);
|
|
88 function From_A is new Ada.Unchecked_Conversion (Address, SA);
|
|
89
|
|
90 function "+" (Left : Address; Right : Integer) return Address is
|
|
91 begin
|
|
92 return To_A (From_A (Left) + SA (Right));
|
|
93 end "+";
|
|
94
|
|
95 function "+" (Left : Integer; Right : Address) return Address is
|
|
96 begin
|
|
97 return To_A (SA (Left) + From_A (Right));
|
|
98 end "+";
|
|
99
|
|
100 function "-" (Left : Address; Right : Address) return Integer is
|
|
101 pragma Unsuppress (All_Checks);
|
|
102 -- Because this can raise Constraint_Error for 64-bit addresses
|
|
103 begin
|
|
104 return Integer (From_A (Left) - From_A (Right));
|
|
105 end "-";
|
|
106
|
|
107 function "-" (Left : Address; Right : Integer) return Address is
|
|
108 begin
|
|
109 return To_A (From_A (Left) - SA (Right));
|
|
110 end "-";
|
|
111
|
|
112 ------------------------
|
|
113 -- Fetch_From_Address --
|
|
114 ------------------------
|
|
115
|
|
116 function Fetch_From_Address (A : Address) return Target is
|
|
117 type T_Ptr is access all Target;
|
|
118 function To_T_Ptr is new Ada.Unchecked_Conversion (Address, T_Ptr);
|
|
119 Ptr : constant T_Ptr := To_T_Ptr (A);
|
|
120 begin
|
|
121 return Ptr.all;
|
|
122 end Fetch_From_Address;
|
|
123
|
|
124 -----------------------
|
|
125 -- Assign_To_Address --
|
|
126 -----------------------
|
|
127
|
|
128 procedure Assign_To_Address (A : Address; T : Target) is
|
|
129 type T_Ptr is access all Target;
|
|
130 function To_T_Ptr is new Ada.Unchecked_Conversion (Address, T_Ptr);
|
|
131 Ptr : constant T_Ptr := To_T_Ptr (A);
|
|
132 begin
|
|
133 Ptr.all := T;
|
|
134 end Assign_To_Address;
|
|
135
|
|
136 ---------------------------------
|
|
137 -- Operations on Unsigned_Byte --
|
|
138 ---------------------------------
|
|
139
|
|
140 -- It would be nice to replace these with intrinsics, but that does
|
|
141 -- not work yet (the back end would be ok, but GNAT itself objects)
|
|
142
|
|
143 type BU is mod 2 ** Unsigned_Byte'Size;
|
|
144 -- Unsigned type of same length as Unsigned_Byte
|
|
145
|
|
146 function To_B is new Ada.Unchecked_Conversion (BU, Unsigned_Byte);
|
|
147 function From_B is new Ada.Unchecked_Conversion (Unsigned_Byte, BU);
|
|
148
|
|
149 function "not" (Left : Unsigned_Byte) return Unsigned_Byte is
|
|
150 begin
|
|
151 return To_B (not From_B (Left));
|
|
152 end "not";
|
|
153
|
|
154 function "and" (Left, Right : Unsigned_Byte) return Unsigned_Byte is
|
|
155 begin
|
|
156 return To_B (From_B (Left) and From_B (Right));
|
|
157 end "and";
|
|
158
|
|
159 function "or" (Left, Right : Unsigned_Byte) return Unsigned_Byte is
|
|
160 begin
|
|
161 return To_B (From_B (Left) or From_B (Right));
|
|
162 end "or";
|
|
163
|
|
164 function "xor" (Left, Right : Unsigned_Byte) return Unsigned_Byte is
|
|
165 begin
|
|
166 return To_B (From_B (Left) xor From_B (Right));
|
|
167 end "xor";
|
|
168
|
|
169 ---------------------------------
|
|
170 -- Operations on Unsigned_Word --
|
|
171 ---------------------------------
|
|
172
|
|
173 -- It would be nice to replace these with intrinsics, but that does
|
|
174 -- not work yet (the back end would be ok, but GNAT itself objects)
|
|
175
|
|
176 type WU is mod 2 ** Unsigned_Word'Size;
|
|
177 -- Unsigned type of same length as Unsigned_Word
|
|
178
|
|
179 function To_W is new Ada.Unchecked_Conversion (WU, Unsigned_Word);
|
|
180 function From_W is new Ada.Unchecked_Conversion (Unsigned_Word, WU);
|
|
181
|
|
182 function "not" (Left : Unsigned_Word) return Unsigned_Word is
|
|
183 begin
|
|
184 return To_W (not From_W (Left));
|
|
185 end "not";
|
|
186
|
|
187 function "and" (Left, Right : Unsigned_Word) return Unsigned_Word is
|
|
188 begin
|
|
189 return To_W (From_W (Left) and From_W (Right));
|
|
190 end "and";
|
|
191
|
|
192 function "or" (Left, Right : Unsigned_Word) return Unsigned_Word is
|
|
193 begin
|
|
194 return To_W (From_W (Left) or From_W (Right));
|
|
195 end "or";
|
|
196
|
|
197 function "xor" (Left, Right : Unsigned_Word) return Unsigned_Word is
|
|
198 begin
|
|
199 return To_W (From_W (Left) xor From_W (Right));
|
|
200 end "xor";
|
|
201
|
|
202 -------------------------------------
|
|
203 -- Operations on Unsigned_Longword --
|
|
204 -------------------------------------
|
|
205
|
|
206 -- It would be nice to replace these with intrinsics, but that does
|
|
207 -- not work yet (the back end would be ok, but GNAT itself objects)
|
|
208
|
|
209 type LWU is mod 2 ** Unsigned_Longword'Size;
|
|
210 -- Unsigned type of same length as Unsigned_Longword
|
|
211
|
|
212 function To_LW is new Ada.Unchecked_Conversion (LWU, Unsigned_Longword);
|
|
213 function From_LW is new Ada.Unchecked_Conversion (Unsigned_Longword, LWU);
|
|
214
|
|
215 function "not" (Left : Unsigned_Longword) return Unsigned_Longword is
|
|
216 begin
|
|
217 return To_LW (not From_LW (Left));
|
|
218 end "not";
|
|
219
|
|
220 function "and" (Left, Right : Unsigned_Longword) return Unsigned_Longword is
|
|
221 begin
|
|
222 return To_LW (From_LW (Left) and From_LW (Right));
|
|
223 end "and";
|
|
224
|
|
225 function "or" (Left, Right : Unsigned_Longword) return Unsigned_Longword is
|
|
226 begin
|
|
227 return To_LW (From_LW (Left) or From_LW (Right));
|
|
228 end "or";
|
|
229
|
|
230 function "xor" (Left, Right : Unsigned_Longword) return Unsigned_Longword is
|
|
231 begin
|
|
232 return To_LW (From_LW (Left) xor From_LW (Right));
|
|
233 end "xor";
|
|
234
|
|
235 -------------------------------
|
|
236 -- Operations on Unsigned_32 --
|
|
237 -------------------------------
|
|
238
|
|
239 -- It would be nice to replace these with intrinsics, but that does
|
|
240 -- not work yet (the back end would be ok, but GNAT itself objects)
|
|
241
|
|
242 type U32 is mod 2 ** Unsigned_32'Size;
|
|
243 -- Unsigned type of same length as Unsigned_32
|
|
244
|
|
245 function To_U32 is new Ada.Unchecked_Conversion (U32, Unsigned_32);
|
|
246 function From_U32 is new Ada.Unchecked_Conversion (Unsigned_32, U32);
|
|
247
|
|
248 function "not" (Left : Unsigned_32) return Unsigned_32 is
|
|
249 begin
|
|
250 return To_U32 (not From_U32 (Left));
|
|
251 end "not";
|
|
252
|
|
253 function "and" (Left, Right : Unsigned_32) return Unsigned_32 is
|
|
254 begin
|
|
255 return To_U32 (From_U32 (Left) and From_U32 (Right));
|
|
256 end "and";
|
|
257
|
|
258 function "or" (Left, Right : Unsigned_32) return Unsigned_32 is
|
|
259 begin
|
|
260 return To_U32 (From_U32 (Left) or From_U32 (Right));
|
|
261 end "or";
|
|
262
|
|
263 function "xor" (Left, Right : Unsigned_32) return Unsigned_32 is
|
|
264 begin
|
|
265 return To_U32 (From_U32 (Left) xor From_U32 (Right));
|
|
266 end "xor";
|
|
267
|
|
268 -------------------------------------
|
|
269 -- Operations on Unsigned_Quadword --
|
|
270 -------------------------------------
|
|
271
|
|
272 -- It would be nice to replace these with intrinsics, but that does
|
|
273 -- not work yet (the back end would be ok, but GNAT itself objects)
|
|
274
|
|
275 type QWU is mod 2 ** 64; -- 64 = Unsigned_Quadword'Size
|
|
276 -- Unsigned type of same length as Unsigned_Quadword
|
|
277
|
|
278 function To_QW is new Ada.Unchecked_Conversion (QWU, Unsigned_Quadword);
|
|
279 function From_QW is new Ada.Unchecked_Conversion (Unsigned_Quadword, QWU);
|
|
280
|
|
281 function "not" (Left : Unsigned_Quadword) return Unsigned_Quadword is
|
|
282 begin
|
|
283 return To_QW (not From_QW (Left));
|
|
284 end "not";
|
|
285
|
|
286 function "and" (Left, Right : Unsigned_Quadword) return Unsigned_Quadword is
|
|
287 begin
|
|
288 return To_QW (From_QW (Left) and From_QW (Right));
|
|
289 end "and";
|
|
290
|
|
291 function "or" (Left, Right : Unsigned_Quadword) return Unsigned_Quadword is
|
|
292 begin
|
|
293 return To_QW (From_QW (Left) or From_QW (Right));
|
|
294 end "or";
|
|
295
|
|
296 function "xor" (Left, Right : Unsigned_Quadword) return Unsigned_Quadword is
|
|
297 begin
|
|
298 return To_QW (From_QW (Left) xor From_QW (Right));
|
|
299 end "xor";
|
|
300
|
|
301 -----------------------
|
|
302 -- Clear_Interlocked --
|
|
303 -----------------------
|
|
304
|
|
305 procedure Clear_Interlocked
|
|
306 (Bit : in out Boolean;
|
|
307 Old_Value : out Boolean)
|
|
308 is
|
|
309 begin
|
|
310 SSL.Lock_Task.all;
|
|
311 Old_Value := Bit;
|
|
312 Bit := False;
|
|
313 SSL.Unlock_Task.all;
|
|
314 end Clear_Interlocked;
|
|
315
|
|
316 procedure Clear_Interlocked
|
|
317 (Bit : in out Boolean;
|
|
318 Old_Value : out Boolean;
|
|
319 Retry_Count : Natural;
|
|
320 Success_Flag : out Boolean)
|
|
321 is
|
|
322 pragma Warnings (Off, Retry_Count);
|
|
323
|
|
324 begin
|
|
325 SSL.Lock_Task.all;
|
|
326 Old_Value := Bit;
|
|
327 Bit := False;
|
|
328 Success_Flag := True;
|
|
329 SSL.Unlock_Task.all;
|
|
330 end Clear_Interlocked;
|
|
331
|
|
332 ---------------------
|
|
333 -- Set_Interlocked --
|
|
334 ---------------------
|
|
335
|
|
336 procedure Set_Interlocked
|
|
337 (Bit : in out Boolean;
|
|
338 Old_Value : out Boolean)
|
|
339 is
|
|
340 begin
|
|
341 SSL.Lock_Task.all;
|
|
342 Old_Value := Bit;
|
|
343 Bit := True;
|
|
344 SSL.Unlock_Task.all;
|
|
345 end Set_Interlocked;
|
|
346
|
|
347 procedure Set_Interlocked
|
|
348 (Bit : in out Boolean;
|
|
349 Old_Value : out Boolean;
|
|
350 Retry_Count : Natural;
|
|
351 Success_Flag : out Boolean)
|
|
352 is
|
|
353 pragma Warnings (Off, Retry_Count);
|
|
354
|
|
355 begin
|
|
356 SSL.Lock_Task.all;
|
|
357 Old_Value := Bit;
|
|
358 Bit := True;
|
|
359 Success_Flag := True;
|
|
360 SSL.Unlock_Task.all;
|
|
361 end Set_Interlocked;
|
|
362
|
|
363 ---------------------
|
|
364 -- Add_Interlocked --
|
|
365 ---------------------
|
|
366
|
|
367 procedure Add_Interlocked
|
|
368 (Addend : Short_Integer;
|
|
369 Augend : in out Aligned_Word;
|
|
370 Sign : out Integer)
|
|
371 is
|
|
372 begin
|
|
373 SSL.Lock_Task.all;
|
|
374 Augend.Value := Augend.Value + Addend;
|
|
375
|
|
376 if Augend.Value < 0 then
|
|
377 Sign := -1;
|
|
378 elsif Augend.Value > 0 then
|
|
379 Sign := +1;
|
|
380 else
|
|
381 Sign := 0;
|
|
382 end if;
|
|
383
|
|
384 SSL.Unlock_Task.all;
|
|
385 end Add_Interlocked;
|
|
386
|
|
387 ----------------
|
|
388 -- Add_Atomic --
|
|
389 ----------------
|
|
390
|
|
391 procedure Add_Atomic
|
|
392 (To : in out Aligned_Integer;
|
|
393 Amount : Integer)
|
|
394 is
|
|
395 begin
|
|
396 SSL.Lock_Task.all;
|
|
397 To.Value := To.Value + Amount;
|
|
398 SSL.Unlock_Task.all;
|
|
399 end Add_Atomic;
|
|
400
|
|
401 procedure Add_Atomic
|
|
402 (To : in out Aligned_Integer;
|
|
403 Amount : Integer;
|
|
404 Retry_Count : Natural;
|
|
405 Old_Value : out Integer;
|
|
406 Success_Flag : out Boolean)
|
|
407 is
|
|
408 pragma Warnings (Off, Retry_Count);
|
|
409
|
|
410 begin
|
|
411 SSL.Lock_Task.all;
|
|
412 Old_Value := To.Value;
|
|
413 To.Value := To.Value + Amount;
|
|
414 Success_Flag := True;
|
|
415 SSL.Unlock_Task.all;
|
|
416 end Add_Atomic;
|
|
417
|
|
418 procedure Add_Atomic
|
|
419 (To : in out Aligned_Long_Integer;
|
|
420 Amount : Long_Integer)
|
|
421 is
|
|
422 begin
|
|
423 SSL.Lock_Task.all;
|
|
424 To.Value := To.Value + Amount;
|
|
425 SSL.Unlock_Task.all;
|
|
426 end Add_Atomic;
|
|
427
|
|
428 procedure Add_Atomic
|
|
429 (To : in out Aligned_Long_Integer;
|
|
430 Amount : Long_Integer;
|
|
431 Retry_Count : Natural;
|
|
432 Old_Value : out Long_Integer;
|
|
433 Success_Flag : out Boolean)
|
|
434 is
|
|
435 pragma Warnings (Off, Retry_Count);
|
|
436
|
|
437 begin
|
|
438 SSL.Lock_Task.all;
|
|
439 Old_Value := To.Value;
|
|
440 To.Value := To.Value + Amount;
|
|
441 Success_Flag := True;
|
|
442 SSL.Unlock_Task.all;
|
|
443 end Add_Atomic;
|
|
444
|
|
445 ----------------
|
|
446 -- And_Atomic --
|
|
447 ----------------
|
|
448
|
|
449 type IU is mod 2 ** Integer'Size;
|
|
450 type LU is mod 2 ** Long_Integer'Size;
|
|
451
|
|
452 function To_IU is new Ada.Unchecked_Conversion (Integer, IU);
|
|
453 function From_IU is new Ada.Unchecked_Conversion (IU, Integer);
|
|
454
|
|
455 function To_LU is new Ada.Unchecked_Conversion (Long_Integer, LU);
|
|
456 function From_LU is new Ada.Unchecked_Conversion (LU, Long_Integer);
|
|
457
|
|
458 procedure And_Atomic
|
|
459 (To : in out Aligned_Integer;
|
|
460 From : Integer)
|
|
461 is
|
|
462 begin
|
|
463 SSL.Lock_Task.all;
|
|
464 To.Value := From_IU (To_IU (To.Value) and To_IU (From));
|
|
465 SSL.Unlock_Task.all;
|
|
466 end And_Atomic;
|
|
467
|
|
468 procedure And_Atomic
|
|
469 (To : in out Aligned_Integer;
|
|
470 From : Integer;
|
|
471 Retry_Count : Natural;
|
|
472 Old_Value : out Integer;
|
|
473 Success_Flag : out Boolean)
|
|
474 is
|
|
475 pragma Warnings (Off, Retry_Count);
|
|
476
|
|
477 begin
|
|
478 SSL.Lock_Task.all;
|
|
479 Old_Value := To.Value;
|
|
480 To.Value := From_IU (To_IU (To.Value) and To_IU (From));
|
|
481 Success_Flag := True;
|
|
482 SSL.Unlock_Task.all;
|
|
483 end And_Atomic;
|
|
484
|
|
485 procedure And_Atomic
|
|
486 (To : in out Aligned_Long_Integer;
|
|
487 From : Long_Integer)
|
|
488 is
|
|
489 begin
|
|
490 SSL.Lock_Task.all;
|
|
491 To.Value := From_LU (To_LU (To.Value) and To_LU (From));
|
|
492 SSL.Unlock_Task.all;
|
|
493 end And_Atomic;
|
|
494
|
|
495 procedure And_Atomic
|
|
496 (To : in out Aligned_Long_Integer;
|
|
497 From : Long_Integer;
|
|
498 Retry_Count : Natural;
|
|
499 Old_Value : out Long_Integer;
|
|
500 Success_Flag : out Boolean)
|
|
501 is
|
|
502 pragma Warnings (Off, Retry_Count);
|
|
503
|
|
504 begin
|
|
505 SSL.Lock_Task.all;
|
|
506 Old_Value := To.Value;
|
|
507 To.Value := From_LU (To_LU (To.Value) and To_LU (From));
|
|
508 Success_Flag := True;
|
|
509 SSL.Unlock_Task.all;
|
|
510 end And_Atomic;
|
|
511
|
|
512 ---------------
|
|
513 -- Or_Atomic --
|
|
514 ---------------
|
|
515
|
|
516 procedure Or_Atomic
|
|
517 (To : in out Aligned_Integer;
|
|
518 From : Integer)
|
|
519 is
|
|
520 begin
|
|
521 SSL.Lock_Task.all;
|
|
522 To.Value := From_IU (To_IU (To.Value) or To_IU (From));
|
|
523 SSL.Unlock_Task.all;
|
|
524 end Or_Atomic;
|
|
525
|
|
526 procedure Or_Atomic
|
|
527 (To : in out Aligned_Integer;
|
|
528 From : Integer;
|
|
529 Retry_Count : Natural;
|
|
530 Old_Value : out Integer;
|
|
531 Success_Flag : out Boolean)
|
|
532 is
|
|
533 pragma Warnings (Off, Retry_Count);
|
|
534
|
|
535 begin
|
|
536 SSL.Lock_Task.all;
|
|
537 Old_Value := To.Value;
|
|
538 To.Value := From_IU (To_IU (To.Value) or To_IU (From));
|
|
539 Success_Flag := True;
|
|
540 SSL.Unlock_Task.all;
|
|
541 end Or_Atomic;
|
|
542
|
|
543 procedure Or_Atomic
|
|
544 (To : in out Aligned_Long_Integer;
|
|
545 From : Long_Integer)
|
|
546 is
|
|
547 begin
|
|
548 SSL.Lock_Task.all;
|
|
549 To.Value := From_LU (To_LU (To.Value) or To_LU (From));
|
|
550 SSL.Unlock_Task.all;
|
|
551 end Or_Atomic;
|
|
552
|
|
553 procedure Or_Atomic
|
|
554 (To : in out Aligned_Long_Integer;
|
|
555 From : Long_Integer;
|
|
556 Retry_Count : Natural;
|
|
557 Old_Value : out Long_Integer;
|
|
558 Success_Flag : out Boolean)
|
|
559 is
|
|
560 pragma Warnings (Off, Retry_Count);
|
|
561
|
|
562 begin
|
|
563 SSL.Lock_Task.all;
|
|
564 Old_Value := To.Value;
|
|
565 To.Value := From_LU (To_LU (To.Value) or To_LU (From));
|
|
566 Success_Flag := True;
|
|
567 SSL.Unlock_Task.all;
|
|
568 end Or_Atomic;
|
|
569
|
|
570 ------------------------------------
|
|
571 -- Declarations for Queue Objects --
|
|
572 ------------------------------------
|
|
573
|
|
574 type QR;
|
|
575
|
|
576 type QR_Ptr is access QR;
|
|
577
|
|
578 type QR is record
|
|
579 Forward : QR_Ptr;
|
|
580 Backward : QR_Ptr;
|
|
581 end record;
|
|
582
|
|
583 function To_QR_Ptr is new Ada.Unchecked_Conversion (Address, QR_Ptr);
|
|
584 function From_QR_Ptr is new Ada.Unchecked_Conversion (QR_Ptr, Address);
|
|
585
|
|
586 ------------
|
|
587 -- Insqhi --
|
|
588 ------------
|
|
589
|
|
590 procedure Insqhi
|
|
591 (Item : Address;
|
|
592 Header : Address;
|
|
593 Status : out Insq_Status)
|
|
594 is
|
|
595 Hedr : constant QR_Ptr := To_QR_Ptr (Header);
|
|
596 Next : constant QR_Ptr := Hedr.Forward;
|
|
597 Itm : constant QR_Ptr := To_QR_Ptr (Item);
|
|
598
|
|
599 begin
|
|
600 SSL.Lock_Task.all;
|
|
601
|
|
602 Itm.Forward := Next;
|
|
603 Itm.Backward := Hedr;
|
|
604 Hedr.Forward := Itm;
|
|
605
|
|
606 if Next = null then
|
|
607 Status := OK_First;
|
|
608
|
|
609 else
|
|
610 Next.Backward := Itm;
|
|
611 Status := OK_Not_First;
|
|
612 end if;
|
|
613
|
|
614 SSL.Unlock_Task.all;
|
|
615 end Insqhi;
|
|
616
|
|
617 ------------
|
|
618 -- Remqhi --
|
|
619 ------------
|
|
620
|
|
621 procedure Remqhi
|
|
622 (Header : Address;
|
|
623 Item : out Address;
|
|
624 Status : out Remq_Status)
|
|
625 is
|
|
626 Hedr : constant QR_Ptr := To_QR_Ptr (Header);
|
|
627 Next : constant QR_Ptr := Hedr.Forward;
|
|
628
|
|
629 begin
|
|
630 SSL.Lock_Task.all;
|
|
631
|
|
632 Item := From_QR_Ptr (Next);
|
|
633
|
|
634 if Next = null then
|
|
635 Status := Fail_Was_Empty;
|
|
636
|
|
637 else
|
|
638 Hedr.Forward := To_QR_Ptr (Item).Forward;
|
|
639
|
|
640 if Hedr.Forward = null then
|
|
641 Status := OK_Empty;
|
|
642
|
|
643 else
|
|
644 Hedr.Forward.Backward := Hedr;
|
|
645 Status := OK_Not_Empty;
|
|
646 end if;
|
|
647 end if;
|
|
648
|
|
649 SSL.Unlock_Task.all;
|
|
650 end Remqhi;
|
|
651
|
|
652 ------------
|
|
653 -- Insqti --
|
|
654 ------------
|
|
655
|
|
656 procedure Insqti
|
|
657 (Item : Address;
|
|
658 Header : Address;
|
|
659 Status : out Insq_Status)
|
|
660 is
|
|
661 Hedr : constant QR_Ptr := To_QR_Ptr (Header);
|
|
662 Prev : constant QR_Ptr := Hedr.Backward;
|
|
663 Itm : constant QR_Ptr := To_QR_Ptr (Item);
|
|
664
|
|
665 begin
|
|
666 SSL.Lock_Task.all;
|
|
667
|
|
668 Itm.Backward := Prev;
|
|
669 Itm.Forward := Hedr;
|
|
670 Hedr.Backward := Itm;
|
|
671
|
|
672 if Prev = null then
|
|
673 Status := OK_First;
|
|
674
|
|
675 else
|
|
676 Prev.Forward := Itm;
|
|
677 Status := OK_Not_First;
|
|
678 end if;
|
|
679
|
|
680 SSL.Unlock_Task.all;
|
|
681 end Insqti;
|
|
682
|
|
683 ------------
|
|
684 -- Remqti --
|
|
685 ------------
|
|
686
|
|
687 procedure Remqti
|
|
688 (Header : Address;
|
|
689 Item : out Address;
|
|
690 Status : out Remq_Status)
|
|
691 is
|
|
692 Hedr : constant QR_Ptr := To_QR_Ptr (Header);
|
|
693 Prev : constant QR_Ptr := Hedr.Backward;
|
|
694
|
|
695 begin
|
|
696 SSL.Lock_Task.all;
|
|
697
|
|
698 Item := From_QR_Ptr (Prev);
|
|
699
|
|
700 if Prev = null then
|
|
701 Status := Fail_Was_Empty;
|
|
702
|
|
703 else
|
|
704 Hedr.Backward := To_QR_Ptr (Item).Backward;
|
|
705
|
|
706 if Hedr.Backward = null then
|
|
707 Status := OK_Empty;
|
|
708
|
|
709 else
|
|
710 Hedr.Backward.Forward := Hedr;
|
|
711 Status := OK_Not_Empty;
|
|
712 end if;
|
|
713 end if;
|
|
714
|
|
715 SSL.Unlock_Task.all;
|
|
716 end Remqti;
|
|
717
|
|
718 end System.Aux_DEC;
|