]>
git.ipfire.org Git - thirdparty/gcc.git/blob - libgomp/config/posix/lock.c
1 /* Copyright (C) 2005, 2008 Free Software Foundation, Inc.
2 Contributed by Richard Henderson <rth@redhat.com>.
4 This file is part of the GNU OpenMP Library (libgomp).
6 Libgomp is free software; you can redistribute it and/or modify it
7 under the terms of the GNU Lesser General Public License as published by
8 the Free Software Foundation; either version 2.1 of the License, or
9 (at your option) any later version.
11 Libgomp is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
16 You should have received a copy of the GNU Lesser General Public License
17 along with libgomp; see the file COPYING.LIB. If not, write to the
18 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19 MA 02110-1301, USA. */
21 /* As a special exception, if you link this library with other files, some
22 of which are compiled with GCC, to produce an executable, this library
23 does not by itself cause the resulting executable to be covered by the
24 GNU General Public License. This exception does not however invalidate
25 any other reasons why the executable file might be covered by the GNU
26 General Public License. */
28 /* This is the default PTHREADS implementation of the public OpenMP
31 Because OpenMP uses different entry points for normal and recursive
32 locks, and pthreads uses only one entry point, a system may be able
33 to do better and streamline the locking as well as reduce the size
34 of the types exported. */
36 /* We need Unix98 extensions to get recursive locks. On Tru64 UNIX V4.0F,
37 the declarations are available without _XOPEN_SOURCE, which actually
38 breaks compilation. */
40 #define _XOPEN_SOURCE 500
45 #ifdef HAVE_BROKEN_POSIX_SEMAPHORES
47 gomp_init_lock_30 (omp_lock_t
*lock
)
49 pthread_mutex_init (lock
, NULL
);
53 gomp_destroy_lock_30 (omp_lock_t
*lock
)
55 pthread_mutex_destroy (lock
);
59 gomp_set_lock_30 (omp_lock_t
*lock
)
61 pthread_mutex_lock (lock
);
65 gomp_unset_lock_30 (omp_lock_t
*lock
)
67 pthread_mutex_unlock (lock
);
71 gomp_test_lock_30 (omp_lock_t
*lock
)
73 return pthread_mutex_trylock (lock
) == 0;
77 gomp_init_nest_lock_30 (omp_nest_lock_t
*lock
)
79 pthread_mutex_init (&lock
->lock
, NULL
);
85 gomp_destroy_nest_lock_30 (omp_nest_lock_t
*lock
)
87 pthread_mutex_destroy (&lock
->lock
);
91 gomp_set_nest_lock_30 (omp_nest_lock_t
*lock
)
93 void *me
= gomp_icv (true);
95 if (lock
->owner
!= me
)
97 pthread_mutex_lock (&lock
->lock
);
104 gomp_unset_nest_lock_30 (omp_nest_lock_t
*lock
)
106 if (--lock
->count
== 0)
109 pthread_mutex_unlock (&lock
->lock
);
114 gomp_test_nest_lock_30 (omp_nest_lock_t
*lock
)
116 void *me
= gomp_icv (true);
118 if (lock
->owner
!= me
)
120 if (pthread_mutex_trylock (&lock
->lock
) != 0)
125 return ++lock
->count
;
131 gomp_init_lock_30 (omp_lock_t
*lock
)
133 sem_init (lock
, 0, 1);
137 gomp_destroy_lock_30 (omp_lock_t
*lock
)
143 gomp_set_lock_30 (omp_lock_t
*lock
)
145 while (sem_wait (lock
) != 0)
150 gomp_unset_lock_30 (omp_lock_t
*lock
)
156 gomp_test_lock_30 (omp_lock_t
*lock
)
158 return sem_trywait (lock
) == 0;
162 gomp_init_nest_lock_30 (omp_nest_lock_t
*lock
)
164 sem_init (&lock
->lock
, 0, 1);
170 gomp_destroy_nest_lock_30 (omp_nest_lock_t
*lock
)
172 sem_destroy (&lock
->lock
);
176 gomp_set_nest_lock_30 (omp_nest_lock_t
*lock
)
178 void *me
= gomp_icv (true);
180 if (lock
->owner
!= me
)
182 while (sem_wait (&lock
->lock
) != 0)
190 gomp_unset_nest_lock_30 (omp_nest_lock_t
*lock
)
192 if (--lock
->count
== 0)
195 sem_post (&lock
->lock
);
200 gomp_test_nest_lock_30 (omp_nest_lock_t
*lock
)
202 void *me
= gomp_icv (true);
204 if (lock
->owner
!= me
)
206 if (sem_trywait (&lock
->lock
) != 0)
211 return ++lock
->count
;
215 #ifdef LIBGOMP_GNU_SYMBOL_VERSIONING
217 gomp_init_lock_25 (omp_lock_25_t
*lock
)
219 pthread_mutex_init (lock
, NULL
);
223 gomp_destroy_lock_25 (omp_lock_25_t
*lock
)
225 pthread_mutex_destroy (lock
);
229 gomp_set_lock_25 (omp_lock_25_t
*lock
)
231 pthread_mutex_lock (lock
);
235 gomp_unset_lock_25 (omp_lock_25_t
*lock
)
237 pthread_mutex_unlock (lock
);
241 gomp_test_lock_25 (omp_lock_25_t
*lock
)
243 return pthread_mutex_trylock (lock
) == 0;
247 gomp_init_nest_lock_25 (omp_nest_lock_25_t
*lock
)
249 pthread_mutexattr_t attr
;
251 pthread_mutexattr_init (&attr
);
252 pthread_mutexattr_settype (&attr
, PTHREAD_MUTEX_RECURSIVE
);
253 pthread_mutex_init (&lock
->lock
, &attr
);
255 pthread_mutexattr_destroy (&attr
);
259 gomp_destroy_nest_lock_25 (omp_nest_lock_25_t
*lock
)
261 pthread_mutex_destroy (&lock
->lock
);
265 gomp_set_nest_lock_25 (omp_nest_lock_25_t
*lock
)
267 pthread_mutex_lock (&lock
->lock
);
272 gomp_unset_nest_lock_25 (omp_nest_lock_25_t
*lock
)
275 pthread_mutex_unlock (&lock
->lock
);
279 gomp_test_nest_lock_25 (omp_nest_lock_25_t
*lock
)
281 if (pthread_mutex_trylock (&lock
->lock
) == 0)
282 return ++lock
->count
;
286 omp_lock_symver (omp_init_lock
)
287 omp_lock_symver (omp_destroy_lock
)
288 omp_lock_symver (omp_set_lock
)
289 omp_lock_symver (omp_unset_lock
)
290 omp_lock_symver (omp_test_lock
)
291 omp_lock_symver (omp_init_nest_lock
)
292 omp_lock_symver (omp_destroy_nest_lock
)
293 omp_lock_symver (omp_set_nest_lock
)
294 omp_lock_symver (omp_unset_nest_lock
)
295 omp_lock_symver (omp_test_nest_lock
)
299 ialias (omp_init_lock
)
300 ialias (omp_init_nest_lock
)
301 ialias (omp_destroy_lock
)
302 ialias (omp_destroy_nest_lock
)
303 ialias (omp_set_lock
)
304 ialias (omp_set_nest_lock
)
305 ialias (omp_unset_lock
)
306 ialias (omp_unset_nest_lock
)
307 ialias (omp_test_lock
)
308 ialias (omp_test_nest_lock
)