annotate libgomp/allocator.c @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 2b5abeee2509
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
152
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1 /* Copyright (C) 2020 Free Software Foundation, Inc.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
2 Contributed by Jakub Jelinek <jakub@redhat.com>.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
3
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
4 This file is part of the GNU Offloading and Multi Processing Library
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
5 (libgomp).
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
6
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
7 Libgomp is free software; you can redistribute it and/or modify it
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
8 under the terms of the GNU General Public License as published by
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
9 the Free Software Foundation; either version 3, or (at your option)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
10 any later version.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
11
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
12 Libgomp is distributed in the hope that it will be useful, but WITHOUT ANY
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
14 FOR A PARTICULAR PURPOSE. See the GNU General Public License for
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
15 more details.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
16
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
17 Under Section 7 of GPL version 3, you are granted additional
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
18 permissions described in the GCC Runtime Library Exception, version
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
19 3.1, as published by the Free Software Foundation.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
20
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
21 You should have received a copy of the GNU General Public License and
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
22 a copy of the GCC Runtime Library Exception along with this program;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
23 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
24 <http://www.gnu.org/licenses/>. */
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
25
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
26 /* This file contains wrappers for the system allocation routines. Most
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
27 places in the OpenMP API do not make any provision for failure, so in
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
28 general we cannot allow memory allocation to fail. */
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
29
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
30 #define _GNU_SOURCE
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
31 #include "libgomp.h"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
32 #include <stdlib.h>
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
33
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
34 #define omp_max_predefined_alloc omp_thread_mem_alloc
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
35
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
36 struct omp_allocator_data
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
37 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
38 omp_memspace_handle_t memspace;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
39 omp_uintptr_t alignment;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
40 omp_uintptr_t pool_size;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
41 omp_uintptr_t used_pool_size;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
42 omp_allocator_handle_t fb_data;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
43 unsigned int sync_hint : 8;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
44 unsigned int access : 8;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
45 unsigned int fallback : 8;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
46 unsigned int pinned : 1;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
47 unsigned int partition : 7;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
48 #ifndef HAVE_SYNC_BUILTINS
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
49 gomp_mutex_t lock;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
50 #endif
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
51 };
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
52
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
53 struct omp_mem_header
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
54 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
55 void *ptr;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
56 size_t size;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
57 omp_allocator_handle_t allocator;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
58 void *pad;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
59 };
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
60
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
61 omp_allocator_handle_t
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
62 omp_init_allocator (omp_memspace_handle_t memspace, int ntraits,
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
63 const omp_alloctrait_t traits[])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
64 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
65 struct omp_allocator_data data
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
66 = { memspace, 1, ~(uintptr_t) 0, 0, 0, omp_atv_contended, omp_atv_all,
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
67 omp_atv_default_mem_fb, omp_atv_false, omp_atv_environment };
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
68 struct omp_allocator_data *ret;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
69 int i;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
70
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
71 if (memspace > omp_low_lat_mem_space)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
72 return omp_null_allocator;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
73 for (i = 0; i < ntraits; i++)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
74 switch (traits[i].key)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
75 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
76 case omp_atk_sync_hint:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
77 switch (traits[i].value)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
78 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
79 case omp_atv_default:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
80 data.sync_hint = omp_atv_contended;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
81 break;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
82 case omp_atv_contended:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
83 case omp_atv_uncontended:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
84 case omp_atv_sequential:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
85 case omp_atv_private:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
86 data.sync_hint = traits[i].value;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
87 break;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
88 default:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
89 return omp_null_allocator;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
90 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
91 break;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
92 case omp_atk_alignment:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
93 if ((traits[i].value & (traits[i].value - 1)) != 0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
94 || !traits[i].value)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
95 return omp_null_allocator;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
96 data.alignment = traits[i].value;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
97 break;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
98 case omp_atk_access:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
99 switch (traits[i].value)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
100 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
101 case omp_atv_default:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
102 data.access = omp_atv_all;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
103 break;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
104 case omp_atv_all:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
105 case omp_atv_cgroup:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
106 case omp_atv_pteam:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
107 case omp_atv_thread:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
108 data.access = traits[i].value;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
109 break;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
110 default:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
111 return omp_null_allocator;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
112 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
113 break;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
114 case omp_atk_pool_size:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
115 data.pool_size = traits[i].value;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
116 break;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
117 case omp_atk_fallback:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
118 switch (traits[i].value)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
119 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
120 case omp_atv_default:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
121 data.fallback = omp_atv_default_mem_fb;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
122 break;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
123 case omp_atv_default_mem_fb:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
124 case omp_atv_null_fb:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
125 case omp_atv_abort_fb:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
126 case omp_atv_allocator_fb:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
127 data.fallback = traits[i].value;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
128 break;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
129 default:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
130 return omp_null_allocator;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
131 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
132 break;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
133 case omp_atk_fb_data:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
134 data.fb_data = traits[i].value;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
135 break;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
136 case omp_atk_pinned:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
137 switch (traits[i].value)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
138 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
139 case omp_atv_default:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
140 case omp_atv_false:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
141 data.pinned = omp_atv_false;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
142 break;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
143 case omp_atv_true:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
144 data.pinned = omp_atv_true;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
145 break;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
146 default:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
147 return omp_null_allocator;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
148 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
149 break;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
150 case omp_atk_partition:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
151 switch (traits[i].value)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
152 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
153 case omp_atv_default:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
154 data.partition = omp_atv_environment;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
155 break;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
156 case omp_atv_environment:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
157 case omp_atv_nearest:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
158 case omp_atv_blocked:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
159 case omp_atv_interleaved:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
160 data.partition = traits[i].value;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
161 break;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
162 default:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
163 return omp_null_allocator;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
164 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
165 break;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
166 default:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
167 return omp_null_allocator;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
168 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
169
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
170 if (data.alignment < sizeof (void *))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
171 data.alignment = sizeof (void *);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
172
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
173 /* No support for these so far (for hbw will use memkind). */
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
174 if (data.pinned || data.memspace == omp_high_bw_mem_space)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
175 return omp_null_allocator;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
176
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
177 ret = gomp_malloc (sizeof (struct omp_allocator_data));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
178 *ret = data;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
179 #ifndef HAVE_SYNC_BUILTINS
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
180 gomp_mutex_init (&ret->lock);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
181 #endif
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
182 return (omp_allocator_handle_t) ret;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
183 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
184
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
185 void
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
186 omp_destroy_allocator (omp_allocator_handle_t allocator)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
187 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
188 if (allocator != omp_null_allocator)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
189 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
190 #ifndef HAVE_SYNC_BUILTINS
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
191 gomp_mutex_destroy (&((struct omp_allocator_data *) allocator)->lock);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
192 #endif
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
193 free ((void *) allocator);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
194 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
195 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
196
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
197 void *
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
198 omp_alloc (size_t size, omp_allocator_handle_t allocator)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
199 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
200 struct omp_allocator_data *allocator_data;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
201 size_t alignment, new_size;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
202 void *ptr, *ret;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
203
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
204 retry:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
205 if (allocator == omp_null_allocator)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
206 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
207 struct gomp_thread *thr = gomp_thread ();
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
208 if (thr->ts.def_allocator == omp_null_allocator)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
209 thr->ts.def_allocator = gomp_def_allocator;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
210 allocator = (omp_allocator_handle_t) thr->ts.def_allocator;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
211 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
212
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
213 if (allocator > omp_max_predefined_alloc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
214 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
215 allocator_data = (struct omp_allocator_data *) allocator;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
216 alignment = allocator_data->alignment;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
217 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
218 else
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
219 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
220 allocator_data = NULL;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
221 alignment = sizeof (void *);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
222 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
223
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
224 new_size = sizeof (struct omp_mem_header);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
225 if (alignment > sizeof (void *))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
226 new_size += alignment - sizeof (void *);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
227 if (__builtin_add_overflow (size, new_size, &new_size))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
228 goto fail;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
229
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
230 if (__builtin_expect (allocator_data
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
231 && allocator_data->pool_size < ~(uintptr_t) 0, 0))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
232 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
233 uintptr_t used_pool_size;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
234 if (new_size > allocator_data->pool_size)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
235 goto fail;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
236 #ifdef HAVE_SYNC_BUILTINS
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
237 used_pool_size = __atomic_load_n (&allocator_data->used_pool_size,
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
238 MEMMODEL_RELAXED);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
239 do
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
240 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
241 uintptr_t new_pool_size;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
242 if (__builtin_add_overflow (used_pool_size, new_size,
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
243 &new_pool_size)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
244 || new_pool_size > allocator_data->pool_size)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
245 goto fail;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
246 if (__atomic_compare_exchange_n (&allocator_data->used_pool_size,
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
247 &used_pool_size, new_pool_size,
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
248 true, MEMMODEL_RELAXED,
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
249 MEMMODEL_RELAXED))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
250 break;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
251 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
252 while (1);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
253 #else
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
254 gomp_mutex_lock (&allocator_data->lock);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
255 if (__builtin_add_overflow (allocator_data->used_pool_size, new_size,
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
256 &used_pool_size)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
257 || used_pool_size > allocator_data->pool_size)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
258 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
259 gomp_mutex_unlock (&allocator_data->lock);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
260 goto fail;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
261 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
262 allocator_data->used_pool_size = used_pool_size;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
263 gomp_mutex_unlock (&allocator_data->lock);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
264 #endif
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
265 ptr = malloc (new_size);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
266 if (ptr == NULL)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
267 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
268 #ifdef HAVE_SYNC_BUILTINS
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
269 __atomic_add_fetch (&allocator_data->used_pool_size, -new_size,
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
270 MEMMODEL_RELAXED);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
271 #else
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
272 gomp_mutex_lock (&allocator_data->lock);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
273 allocator_data->used_pool_size -= new_size;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
274 gomp_mutex_unlock (&allocator_data->lock);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
275 #endif
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
276 goto fail;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
277 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
278 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
279 else
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
280 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
281 ptr = malloc (new_size);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
282 if (ptr == NULL)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
283 goto fail;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
284 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
285
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
286 if (alignment > sizeof (void *))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
287 ret = (void *) (((uintptr_t) ptr
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
288 + sizeof (struct omp_mem_header)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
289 + alignment - sizeof (void *)) & ~(alignment - 1));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
290 else
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
291 ret = (char *) ptr + sizeof (struct omp_mem_header);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
292 ((struct omp_mem_header *) ret)[-1].ptr = ptr;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
293 ((struct omp_mem_header *) ret)[-1].size = new_size;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
294 ((struct omp_mem_header *) ret)[-1].allocator = allocator;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
295 return ret;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
296
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
297 fail:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
298 if (allocator_data)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
299 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
300 switch (allocator_data->fallback)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
301 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
302 case omp_atv_default_mem_fb:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
303 if (alignment > sizeof (void *)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
304 || (allocator_data
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
305 && allocator_data->pool_size < ~(uintptr_t) 0))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
306 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
307 allocator = omp_default_mem_alloc;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
308 goto retry;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
309 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
310 /* Otherwise, we've already performed default mem allocation
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
311 and if that failed, it won't succeed again (unless it was
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
312 intermitent. Return NULL then, as that is the fallback. */
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
313 break;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
314 case omp_atv_null_fb:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
315 break;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
316 default:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
317 case omp_atv_abort_fb:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
318 gomp_fatal ("Out of memory allocating %lu bytes",
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
319 (unsigned long) size);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
320 case omp_atv_allocator_fb:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
321 allocator = allocator_data->fb_data;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
322 goto retry;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
323 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
324 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
325 return NULL;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
326 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
327
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
328 void
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
329 omp_free (void *ptr, omp_allocator_handle_t allocator)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
330 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
331 struct omp_mem_header *data;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
332
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
333 if (ptr == NULL)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
334 return;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
335 (void) allocator;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
336 data = &((struct omp_mem_header *) ptr)[-1];
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
337 if (data->allocator > omp_max_predefined_alloc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
338 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
339 struct omp_allocator_data *allocator_data
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
340 = (struct omp_allocator_data *) (data->allocator);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
341 if (allocator_data->pool_size < ~(uintptr_t) 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
342 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
343 #ifdef HAVE_SYNC_BUILTINS
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
344 __atomic_add_fetch (&allocator_data->used_pool_size, -data->size,
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
345 MEMMODEL_RELAXED);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
346 #else
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
347 gomp_mutex_lock (&allocator_data->lock);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
348 allocator_data->used_pool_size -= data->new_size;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
349 gomp_mutex_unlock (&allocator_data->lock);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
350 #endif
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
351 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
352 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
353 free (data->ptr);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
354 }