config/linux/mutex.h

Go to the documentation of this file.
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 */

Generated on Fri Apr 5 05:38:09 2013 for Libgomp by  doxygen 1.4.7