annotate gcc/ada/libgnarl/a-synbar__posix.adb @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children 84e7813d76e9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 ------------------------------------------------------------------------------
kono
parents:
diff changeset
2 -- --
kono
parents:
diff changeset
3 -- GNAT RUN-TIME COMPONENTS --
kono
parents:
diff changeset
4 -- --
kono
parents:
diff changeset
5 -- A D A . S Y N C H R O N O U S _ B A R R I E R S --
kono
parents:
diff changeset
6 -- --
kono
parents:
diff changeset
7 -- B o d y --
kono
parents:
diff changeset
8 -- --
kono
parents:
diff changeset
9 -- Copyright (C) 1992-2017, Free Software Foundation, Inc. --
kono
parents:
diff changeset
10 -- --
kono
parents:
diff changeset
11 -- This specification is derived from the Ada Reference Manual for use with --
kono
parents:
diff changeset
12 -- GNAT. The copyright notice above, and the license provisions that follow --
kono
parents:
diff changeset
13 -- apply solely to the contents of the part following the private keyword. --
kono
parents:
diff changeset
14 -- --
kono
parents:
diff changeset
15 -- GNAT is free software; you can redistribute it and/or modify it under --
kono
parents:
diff changeset
16 -- terms of the GNU General Public License as published by the Free Soft- --
kono
parents:
diff changeset
17 -- ware Foundation; either version 3, or (at your option) any later ver- --
kono
parents:
diff changeset
18 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
kono
parents:
diff changeset
19 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
kono
parents:
diff changeset
20 -- or FITNESS FOR A PARTICULAR PURPOSE. --
kono
parents:
diff changeset
21 -- --
kono
parents:
diff changeset
22 -- As a special exception under Section 7 of GPL version 3, you are granted --
kono
parents:
diff changeset
23 -- additional permissions described in the GCC Runtime Library Exception, --
kono
parents:
diff changeset
24 -- version 3.1, as published by the Free Software Foundation. --
kono
parents:
diff changeset
25 -- --
kono
parents:
diff changeset
26 -- You should have received a copy of the GNU General Public License and --
kono
parents:
diff changeset
27 -- a copy of the GCC Runtime Library Exception along with this program; --
kono
parents:
diff changeset
28 -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
kono
parents:
diff changeset
29 -- <http://www.gnu.org/licenses/>. --
kono
parents:
diff changeset
30 -- --
kono
parents:
diff changeset
31 -- GNAT was originally developed by the GNAT team at New York University. --
kono
parents:
diff changeset
32 -- Extensive contributions were provided by Ada Core Technologies Inc. --
kono
parents:
diff changeset
33 -- --
kono
parents:
diff changeset
34 ------------------------------------------------------------------------------
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36 -- This is the body of this package using POSIX barriers
kono
parents:
diff changeset
37
kono
parents:
diff changeset
38 with Interfaces.C; use Interfaces.C;
kono
parents:
diff changeset
39
kono
parents:
diff changeset
40 package body Ada.Synchronous_Barriers is
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 --------------------
kono
parents:
diff changeset
43 -- POSIX barriers --
kono
parents:
diff changeset
44 --------------------
kono
parents:
diff changeset
45
kono
parents:
diff changeset
46 function pthread_barrier_init
kono
parents:
diff changeset
47 (barrier : not null access pthread_barrier_t;
kono
parents:
diff changeset
48 attr : System.Address := System.Null_Address;
kono
parents:
diff changeset
49 count : unsigned) return int;
kono
parents:
diff changeset
50 pragma Import (C, pthread_barrier_init, "pthread_barrier_init");
kono
parents:
diff changeset
51 -- Initialize barrier with the attributes in attr. The barrier is opened
kono
parents:
diff changeset
52 -- when count waiters arrived. If attr is null the default barrier
kono
parents:
diff changeset
53 -- attributes are used.
kono
parents:
diff changeset
54
kono
parents:
diff changeset
55 function pthread_barrier_destroy
kono
parents:
diff changeset
56 (barrier : not null access pthread_barrier_t) return int;
kono
parents:
diff changeset
57 pragma Import (C, pthread_barrier_destroy, "pthread_barrier_destroy");
kono
parents:
diff changeset
58 -- Destroy a previously dynamically initialized barrier
kono
parents:
diff changeset
59
kono
parents:
diff changeset
60 function pthread_barrier_wait
kono
parents:
diff changeset
61 (barrier : not null access pthread_barrier_t) return int;
kono
parents:
diff changeset
62 pragma Import (C, pthread_barrier_wait, "pthread_barrier_wait");
kono
parents:
diff changeset
63 -- Wait on barrier
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 --------------
kono
parents:
diff changeset
66 -- Finalize --
kono
parents:
diff changeset
67 --------------
kono
parents:
diff changeset
68
kono
parents:
diff changeset
69 overriding procedure Finalize (Barrier : in out Synchronous_Barrier) is
kono
parents:
diff changeset
70 Result : int;
kono
parents:
diff changeset
71 begin
kono
parents:
diff changeset
72 Result := pthread_barrier_destroy (Barrier.POSIX_Barrier'Access);
kono
parents:
diff changeset
73 pragma Assert (Result = 0);
kono
parents:
diff changeset
74 end Finalize;
kono
parents:
diff changeset
75
kono
parents:
diff changeset
76 overriding procedure Initialize (Barrier : in out Synchronous_Barrier) is
kono
parents:
diff changeset
77 Result : int;
kono
parents:
diff changeset
78 begin
kono
parents:
diff changeset
79 Result :=
kono
parents:
diff changeset
80 pthread_barrier_init
kono
parents:
diff changeset
81 (barrier => Barrier.POSIX_Barrier'Access,
kono
parents:
diff changeset
82 attr => System.Null_Address,
kono
parents:
diff changeset
83 count => unsigned (Barrier.Release_Threshold));
kono
parents:
diff changeset
84 pragma Assert (Result = 0);
kono
parents:
diff changeset
85 end Initialize;
kono
parents:
diff changeset
86
kono
parents:
diff changeset
87 ----------------------
kono
parents:
diff changeset
88 -- Wait_For_Release --
kono
parents:
diff changeset
89 ----------------------
kono
parents:
diff changeset
90
kono
parents:
diff changeset
91 procedure Wait_For_Release
kono
parents:
diff changeset
92 (The_Barrier : in out Synchronous_Barrier;
kono
parents:
diff changeset
93 Notified : out Boolean)
kono
parents:
diff changeset
94 is
kono
parents:
diff changeset
95 Result : int;
kono
parents:
diff changeset
96
kono
parents:
diff changeset
97 PTHREAD_BARRIER_SERIAL_THREAD : constant := -1;
kono
parents:
diff changeset
98 -- Value used to indicate the task which receives the notification for
kono
parents:
diff changeset
99 -- the barrier open.
kono
parents:
diff changeset
100
kono
parents:
diff changeset
101 begin
kono
parents:
diff changeset
102 Result :=
kono
parents:
diff changeset
103 pthread_barrier_wait
kono
parents:
diff changeset
104 (barrier => The_Barrier.POSIX_Barrier'Access);
kono
parents:
diff changeset
105 pragma Assert
kono
parents:
diff changeset
106 (Result = 0 or else Result = PTHREAD_BARRIER_SERIAL_THREAD);
kono
parents:
diff changeset
107
kono
parents:
diff changeset
108 Notified := (Result = PTHREAD_BARRIER_SERIAL_THREAD);
kono
parents:
diff changeset
109 end Wait_For_Release;
kono
parents:
diff changeset
110
kono
parents:
diff changeset
111 end Ada.Synchronous_Barriers;