00001 /* Copyright (C) 2005, 2006, 2009 Free Software Foundation, Inc. 00002 Contributed by Richard Henderson <rth@redhat.com>. 00003 00004 This file is part of the GNU OpenMP Library (libgomp). 00005 00006 Libgomp is free software; you can redistribute it and/or modify it 00007 under the terms of the GNU General Public License as published by 00008 the Free Software Foundation; either version 3, or (at your option) 00009 any later version. 00010 00011 Libgomp is distributed in the hope that it will be useful, but WITHOUT ANY 00012 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 00013 FOR A PARTICULAR PURPOSE. See the GNU General Public License for 00014 more details. 00015 00016 Under Section 7 of GPL version 3, you are granted additional 00017 permissions described in the GCC Runtime Library Exception, version 00018 3.1, as published by the Free Software Foundation. 00019 00020 You should have received a copy of the GNU General Public License and 00021 a copy of the GCC Runtime Library Exception along with this program; 00022 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 00023 <http://www.gnu.org/licenses/>. */ 00024 00025 /* This is the default POSIX 1003.1b implementation of a semaphore 00026 synchronization mechanism for libgomp. This type is private to 00027 the library. 00028 00029 This is a bit heavy weight for what we need, in that we're not 00030 interested in sem_wait as a cancelation point, but it's not too 00031 bad for a default. */ 00032 00033 #ifndef GOMP_SEM_H 00034 #define GOMP_SEM_H 1 00035 00036 #ifdef HAVE_ATTRIBUTE_VISIBILITY 00037 # pragma GCC visibility push(default) 00038 #endif 00039 00040 #include <semaphore.h> 00041 00042 #ifdef HAVE_ATTRIBUTE_VISIBILITY 00043 # pragma GCC visibility pop 00044 #endif 00045 00046 #ifdef HAVE_BROKEN_POSIX_SEMAPHORES 00047 #include <pthread.h> 00048 00049 struct gomp_sem 00050 { 00051 pthread_mutex_t mutex; 00052 pthread_cond_t cond; 00053 int value; 00054 }; 00055 00056 typedef struct gomp_sem gomp_sem_t; 00057 00058 extern void gomp_sem_init (gomp_sem_t *sem, int value); 00059 00060 extern void gomp_sem_wait (gomp_sem_t *sem); 00061 00062 extern void gomp_sem_post (gomp_sem_t *sem); 00063 00064 extern void gomp_sem_destroy (gomp_sem_t *sem); 00065 00066 #else /* HAVE_BROKEN_POSIX_SEMAPHORES */ 00067 00068 typedef sem_t gomp_sem_t; 00069 00070 static inline void gomp_sem_init (gomp_sem_t *sem, int value) 00071 { 00072 sem_init (sem, 0, value); 00073 } 00074 00075 extern void gomp_sem_wait (gomp_sem_t *sem); 00076 00077 static inline void gomp_sem_post (gomp_sem_t *sem) 00078 { 00079 sem_post (sem); 00080 } 00081 00082 static inline void gomp_sem_destroy (gomp_sem_t *sem) 00083 { 00084 sem_destroy (sem); 00085 } 00086 #endif /* doesn't HAVE_BROKEN_POSIX_SEMAPHORES */ 00087 #endif /* GOMP_SEM_H */