00001 /* Copyright (C) 2005, 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 a Linux specific implementation of a mutex synchronization 00026 mechanism for libgomp. This type is private to the library. This 00027 implementation uses atomic instructions and the futex syscall. */ 00028 00029 #ifndef GOMP_MUTEX_H 00030 #define GOMP_MUTEX_H 1 00031 00032 typedef int gomp_mutex_t; 00033 00034 #define GOMP_MUTEX_INIT_0 1 00035 00036 static inline void gomp_mutex_init (gomp_mutex_t *mutex) 00037 { 00038 *mutex = 0; 00039 } 00040 00041 extern void gomp_mutex_lock_slow (gomp_mutex_t *mutex); 00042 static inline void gomp_mutex_lock (gomp_mutex_t *mutex) 00043 { 00044 if (!__sync_bool_compare_and_swap (mutex, 0, 1)) 00045 gomp_mutex_lock_slow (mutex); 00046 } 00047 00048 extern void gomp_mutex_unlock_slow (gomp_mutex_t *mutex); 00049 static inline void gomp_mutex_unlock (gomp_mutex_t *mutex) 00050 { 00051 /* Warning: By definition __sync_lock_test_and_set() does not have 00052 proper memory barrier semantics for a mutex unlock operation. 00053 However, this default implementation is written assuming that it 00054 does, which is true for some targets. 00055 00056 Targets that require additional memory barriers before 00057 __sync_lock_test_and_set to achieve the release semantics of 00058 mutex unlock, are encouraged to include 00059 "config/linux/ia64/mutex.h" in a target specific mutex.h instead 00060 of using this file. */ 00061 int val = __sync_lock_test_and_set (mutex, 0); 00062 if (__builtin_expect (val > 1, 0)) 00063 gomp_mutex_unlock_slow (mutex); 00064 } 00065 00066 static inline void gomp_mutex_destroy (gomp_mutex_t *mutex) 00067 { 00068 } 00069 00070 #endif /* GOMP_MUTEX_H */