diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog index e10c45589a4..6b9592bda73 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -1,3 +1,9 @@ +2009-08-04 David Daney + + * config/linux/mutex.h (gomp_mutex_unlock): Add comment about + needed memory barrier semantics. + * config/linux/mips/mutex.h: New file. + 2009-07-30 Ralf Wildenhues * configure.ac (_AC_ARG_VAR_PRECIOUS): Use m4_rename_force. diff --git a/libgomp/config/linux/mips/mutex.h b/libgomp/config/linux/mips/mutex.h new file mode 100644 index 00000000000..668cc11b29a --- /dev/null +++ b/libgomp/config/linux/mips/mutex.h @@ -0,0 +1,27 @@ +/* Copyright (C) 2009 Free Software Foundation, Inc. + + This file is part of the GNU OpenMP Library (libgomp). + + Libgomp is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + Libgomp is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. + + Under Section 7 of GPL version 3, you are granted additional + permissions described in the GCC Runtime Library Exception, version + 3.1, as published by the Free Software Foundation. + + You should have received a copy of the GNU General Public License and + a copy of the GCC Runtime Library Exception along with this program; + see the files COPYING3 and COPYING.RUNTIME respectively. If not, see + . */ + +/* MIPS needs the same correct usage of __sync_synchronize and + __sync_lock_test_and_set as ia64. So we just use its mutex.h. */ + +#include "config/linux/ia64/mutex.h" diff --git a/libgomp/config/linux/mutex.h b/libgomp/config/linux/mutex.h index 07a2156a462..1905ce012fd 100644 --- a/libgomp/config/linux/mutex.h +++ b/libgomp/config/linux/mutex.h @@ -48,6 +48,16 @@ static inline void gomp_mutex_lock (gomp_mutex_t *mutex) extern void gomp_mutex_unlock_slow (gomp_mutex_t *mutex); static inline void gomp_mutex_unlock (gomp_mutex_t *mutex) { + /* Warning: By definition __sync_lock_test_and_set() does not have + proper memory barrier semantics for a mutex unlock operation. + However, this default implementation is written assuming that it + does, which is true for some targets. + + Targets that require additional memory barriers before + __sync_lock_test_and_set to achieve the release semantics of + mutex unlock, are encouraged to include + "config/linux/ia64/mutex.h" in a target specific mutex.h instead + of using this file. */ int val = __sync_lock_test_and_set (mutex, 0); if (__builtin_expect (val > 1, 0)) gomp_mutex_unlock_slow (mutex);