From 039890a67818211dba8207feab3832b0fcc391d2 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Wed, 14 May 2014 15:32:18 -0700 Subject: Move remaining files out of nptl/sysdeps/unix/sysv/linux/x86/. --- ChangeLog | 32 ++++++++ nptl/sysdeps/unix/sysv/linux/x86/Makefile | 3 - nptl/sysdeps/unix/sysv/linux/x86/elision-conf.c | 81 ------------------ nptl/sysdeps/unix/sysv/linux/x86/elision-conf.h | 43 ---------- nptl/sysdeps/unix/sysv/linux/x86/elision-lock.c | 95 ---------------------- nptl/sysdeps/unix/sysv/linux/x86/elision-timed.c | 26 ------ nptl/sysdeps/unix/sysv/linux/x86/elision-trylock.c | 71 ---------------- nptl/sysdeps/unix/sysv/linux/x86/elision-unlock.c | 33 -------- nptl/sysdeps/unix/sysv/linux/x86/force-elision.h | 31 ------- nptl/sysdeps/unix/sysv/linux/x86/hle.h | 75 ----------------- nptl/sysdeps/unix/sysv/linux/x86/init-arch.c | 1 - nptl/sysdeps/unix/sysv/linux/x86/init-arch.h | 1 - .../unix/sysv/linux/x86/pthread_mutex_cond_lock.c | 22 ----- .../unix/sysv/linux/x86/pthread_mutex_lock.c | 22 ----- .../unix/sysv/linux/x86/pthread_mutex_timedlock.c | 22 ----- .../unix/sysv/linux/x86/pthread_mutex_trylock.c | 22 ----- sysdeps/unix/sysv/linux/x86/Makefile | 6 ++ sysdeps/unix/sysv/linux/x86/elision-conf.c | 81 ++++++++++++++++++ sysdeps/unix/sysv/linux/x86/elision-conf.h | 43 ++++++++++ sysdeps/unix/sysv/linux/x86/elision-lock.c | 95 ++++++++++++++++++++++ sysdeps/unix/sysv/linux/x86/elision-timed.c | 26 ++++++ sysdeps/unix/sysv/linux/x86/elision-trylock.c | 71 ++++++++++++++++ sysdeps/unix/sysv/linux/x86/elision-unlock.c | 33 ++++++++ sysdeps/unix/sysv/linux/x86/force-elision.h | 31 +++++++ sysdeps/unix/sysv/linux/x86/hle.h | 75 +++++++++++++++++ sysdeps/unix/sysv/linux/x86/init-arch.c | 1 + sysdeps/unix/sysv/linux/x86/init-arch.h | 1 + .../unix/sysv/linux/x86/pthread_mutex_cond_lock.c | 22 +++++ sysdeps/unix/sysv/linux/x86/pthread_mutex_lock.c | 22 +++++ .../unix/sysv/linux/x86/pthread_mutex_timedlock.c | 22 +++++ .../unix/sysv/linux/x86/pthread_mutex_trylock.c | 22 +++++ 31 files changed, 583 insertions(+), 548 deletions(-) delete mode 100644 nptl/sysdeps/unix/sysv/linux/x86/Makefile delete mode 100644 nptl/sysdeps/unix/sysv/linux/x86/elision-conf.c delete mode 100644 nptl/sysdeps/unix/sysv/linux/x86/elision-conf.h delete mode 100644 nptl/sysdeps/unix/sysv/linux/x86/elision-lock.c delete mode 100644 nptl/sysdeps/unix/sysv/linux/x86/elision-timed.c delete mode 100644 nptl/sysdeps/unix/sysv/linux/x86/elision-trylock.c delete mode 100644 nptl/sysdeps/unix/sysv/linux/x86/elision-unlock.c delete mode 100644 nptl/sysdeps/unix/sysv/linux/x86/force-elision.h delete mode 100644 nptl/sysdeps/unix/sysv/linux/x86/hle.h delete mode 100644 nptl/sysdeps/unix/sysv/linux/x86/init-arch.c delete mode 100644 nptl/sysdeps/unix/sysv/linux/x86/init-arch.h delete mode 100644 nptl/sysdeps/unix/sysv/linux/x86/pthread_mutex_cond_lock.c delete mode 100644 nptl/sysdeps/unix/sysv/linux/x86/pthread_mutex_lock.c delete mode 100644 nptl/sysdeps/unix/sysv/linux/x86/pthread_mutex_timedlock.c delete mode 100644 nptl/sysdeps/unix/sysv/linux/x86/pthread_mutex_trylock.c create mode 100644 sysdeps/unix/sysv/linux/x86/elision-conf.c create mode 100644 sysdeps/unix/sysv/linux/x86/elision-conf.h create mode 100644 sysdeps/unix/sysv/linux/x86/elision-lock.c create mode 100644 sysdeps/unix/sysv/linux/x86/elision-timed.c create mode 100644 sysdeps/unix/sysv/linux/x86/elision-trylock.c create mode 100644 sysdeps/unix/sysv/linux/x86/elision-unlock.c create mode 100644 sysdeps/unix/sysv/linux/x86/force-elision.h create mode 100644 sysdeps/unix/sysv/linux/x86/hle.h create mode 100644 sysdeps/unix/sysv/linux/x86/init-arch.c create mode 100644 sysdeps/unix/sysv/linux/x86/init-arch.h create mode 100644 sysdeps/unix/sysv/linux/x86/pthread_mutex_cond_lock.c create mode 100644 sysdeps/unix/sysv/linux/x86/pthread_mutex_lock.c create mode 100644 sysdeps/unix/sysv/linux/x86/pthread_mutex_timedlock.c create mode 100644 sysdeps/unix/sysv/linux/x86/pthread_mutex_trylock.c diff --git a/ChangeLog b/ChangeLog index c685bc705b..b6f05608e3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,37 @@ 2014-05-14 Roland McGrath + * nptl/sysdeps/unix/sysv/linux/x86/Makefile: File removed. + * sysdeps/unix/sysv/linux/x86/Makefile [$(subdir) = nptl] + (libpthread-sysdep_routines): Add elision-related stuff here instead. + * nptl/sysdeps/unix/sysv/linux/x86/elision-conf.c: Moved ... + * sysdeps/unix/sysv/linux/x86/elision-conf.c: ... here. + * nptl/sysdeps/unix/sysv/linux/x86/elision-conf.h: Moved ... + * sysdeps/unix/sysv/linux/x86/elision-conf.h: ... here. + * nptl/sysdeps/unix/sysv/linux/x86/elision-lock.c: Moved ... + * sysdeps/unix/sysv/linux/x86/elision-lock.c: ... here. + * nptl/sysdeps/unix/sysv/linux/x86/elision-timed.c: Moved ... + * sysdeps/unix/sysv/linux/x86/elision-timed.c: ... here. + * nptl/sysdeps/unix/sysv/linux/x86/elision-trylock.c: Moved ... + * sysdeps/unix/sysv/linux/x86/elision-trylock.c: ... here. + * nptl/sysdeps/unix/sysv/linux/x86/elision-unlock.c: Moved ... + * sysdeps/unix/sysv/linux/x86/elision-unlock.c: ... here. + * nptl/sysdeps/unix/sysv/linux/x86/force-elision.h: Moved ... + * sysdeps/unix/sysv/linux/x86/force-elision.h: ... here. + * nptl/sysdeps/unix/sysv/linux/x86/hle.h: Moved ... + * sysdeps/unix/sysv/linux/x86/hle.h: ... here. + * nptl/sysdeps/unix/sysv/linux/x86/init-arch.c: Moved ... + * sysdeps/unix/sysv/linux/x86/init-arch.c: ... here. + * nptl/sysdeps/unix/sysv/linux/x86/init-arch.h: Moved ... + * sysdeps/unix/sysv/linux/x86/init-arch.h: ... here. + * nptl/sysdeps/unix/sysv/linux/x86/pthread_mutex_cond_lock.c: Moved ... + * sysdeps/unix/sysv/linux/x86/pthread_mutex_cond_lock.c: ... here. + * nptl/sysdeps/unix/sysv/linux/x86/pthread_mutex_lock.c: Moved ... + * sysdeps/unix/sysv/linux/x86/pthread_mutex_lock.c: ... here. + * nptl/sysdeps/unix/sysv/linux/x86/pthread_mutex_timedlock.c: Moved ... + * sysdeps/unix/sysv/linux/x86/pthread_mutex_timedlock.c: ... here. + * nptl/sysdeps/unix/sysv/linux/x86/pthread_mutex_trylock.c: Moved ... + * sysdeps/unix/sysv/linux/x86/pthread_mutex_trylock.c: ... here. + * sysdeps/unix/sysv/linux/mips/fork.h: New file. * sysdeps/unix/sysv/linux/mips/nptl/fork.c: File removed. diff --git a/nptl/sysdeps/unix/sysv/linux/x86/Makefile b/nptl/sysdeps/unix/sysv/linux/x86/Makefile deleted file mode 100644 index 61b7552bc9..0000000000 --- a/nptl/sysdeps/unix/sysv/linux/x86/Makefile +++ /dev/null @@ -1,3 +0,0 @@ -libpthread-sysdep_routines += init-arch -libpthread-sysdep_routines += elision-lock elision-unlock elision-timed \ - elision-trylock diff --git a/nptl/sysdeps/unix/sysv/linux/x86/elision-conf.c b/nptl/sysdeps/unix/sysv/linux/x86/elision-conf.c deleted file mode 100644 index e6f5d6d1ab..0000000000 --- a/nptl/sysdeps/unix/sysv/linux/x86/elision-conf.c +++ /dev/null @@ -1,81 +0,0 @@ -/* elision-conf.c: Lock elision tunable parameters. - Copyright (C) 2013-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#include "config.h" -#include -#include -#include -#include - -/* Reasonable initial tuning values, may be revised in the future. - This is a conservative initial value. */ - -struct elision_config __elision_aconf = - { - /* How often to not attempt to use elision if a transaction aborted - because the lock is already acquired. Expressed in number of lock - acquisition attempts. */ - .skip_lock_busy = 3, - /* How often to not attempt to use elision if a transaction aborted due - to reasons other than other threads' memory accesses. Expressed in - number of lock acquisition attempts. */ - .skip_lock_internal_abort = 3, - /* How often we retry using elision if there is chance for the transaction - to finish execution (e.g., it wasn't aborted due to the lock being - already acquired. */ - .retry_try_xbegin = 3, - /* Same as SKIP_LOCK_INTERNAL_ABORT but for trylock. */ - .skip_trylock_internal_abort = 3, - }; - -/* Set when the CPU supports elision. When false elision is never attempted. - */ - -int __elision_available attribute_hidden; - -/* Force elision for all new locks. This is used to decide whether existing - DEFAULT locks should be automatically upgraded to elision in - pthread_mutex_lock(). Disabled for suid programs. Only used when elision - is available. */ - -int __pthread_force_elision attribute_hidden; - -/* Initialize elison. */ - -static void -elision_init (int argc __attribute__ ((unused)), - char **argv __attribute__ ((unused)), - char **environ) -{ - __elision_available = HAS_RTM; -#ifdef ENABLE_LOCK_ELISION - __pthread_force_elision = __libc_enable_secure ? 0 : __elision_available; -#endif -} - -#ifdef SHARED -# define INIT_SECTION ".init_array" -#else -# define INIT_SECTION ".preinit_array" -#endif - -void (*const __pthread_init_array []) (int, char **, char **) - __attribute__ ((section (INIT_SECTION), aligned (sizeof (void *)))) = -{ - &elision_init -}; diff --git a/nptl/sysdeps/unix/sysv/linux/x86/elision-conf.h b/nptl/sysdeps/unix/sysv/linux/x86/elision-conf.h deleted file mode 100644 index 6790b5aa13..0000000000 --- a/nptl/sysdeps/unix/sysv/linux/x86/elision-conf.h +++ /dev/null @@ -1,43 +0,0 @@ -/* elision-conf.h: Lock elision tunable parameters. - Copyright (C) 2013-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ -#ifndef _ELISION_CONF_H -#define _ELISION_CONF_H 1 - -#include -#include -#include - -/* Should make sure there is no false sharing on this. */ - -struct elision_config -{ - int skip_lock_busy; - int skip_lock_internal_abort; - int retry_try_xbegin; - int skip_trylock_internal_abort; -}; - -extern struct elision_config __elision_aconf attribute_hidden; - -extern int __elision_available attribute_hidden; -extern int __pthread_force_elision attribute_hidden; - -/* Tell the test suite to test elision for this architecture. */ -#define HAVE_ELISION 1 - -#endif diff --git a/nptl/sysdeps/unix/sysv/linux/x86/elision-lock.c b/nptl/sysdeps/unix/sysv/linux/x86/elision-lock.c deleted file mode 100644 index 385ac31a52..0000000000 --- a/nptl/sysdeps/unix/sysv/linux/x86/elision-lock.c +++ /dev/null @@ -1,95 +0,0 @@ -/* elision-lock.c: Elided pthread mutex lock. - Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#include -#include "pthreadP.h" -#include "lowlevellock.h" -#include "hle.h" -#include - -#if !defined(LLL_LOCK) && !defined(EXTRAARG) -/* Make sure the configuration code is always linked in for static - libraries. */ -#include "elision-conf.c" -#endif - -#ifndef EXTRAARG -#define EXTRAARG -#endif -#ifndef LLL_LOCK -#define LLL_LOCK(a,b) lll_lock(a,b), 0 -#endif - -#define aconf __elision_aconf - -/* Adaptive lock using transactions. - By default the lock region is run as a transaction, and when it - aborts or the lock is busy the lock adapts itself. */ - -int -__lll_lock_elision (int *futex, short *adapt_count, EXTRAARG int private) -{ - if (*adapt_count <= 0) - { - unsigned status; - int try_xbegin; - - for (try_xbegin = aconf.retry_try_xbegin; - try_xbegin > 0; - try_xbegin--) - { - if ((status = _xbegin()) == _XBEGIN_STARTED) - { - if (*futex == 0) - return 0; - - /* Lock was busy. Fall back to normal locking. - Could also _xend here but xabort with 0xff code - is more visible in the profiler. */ - _xabort (_ABORT_LOCK_BUSY); - } - - if (!(status & _XABORT_RETRY)) - { - if ((status & _XABORT_EXPLICIT) - && _XABORT_CODE (status) == _ABORT_LOCK_BUSY) - { - /* Right now we skip here. Better would be to wait a bit - and retry. This likely needs some spinning. */ - if (*adapt_count != aconf.skip_lock_busy) - *adapt_count = aconf.skip_lock_busy; - } - /* Internal abort. There is no chance for retry. - Use the normal locking and next time use lock. - Be careful to avoid writing to the lock. */ - else if (*adapt_count != aconf.skip_lock_internal_abort) - *adapt_count = aconf.skip_lock_internal_abort; - break; - } - } - } - else - { - /* Use a normal lock until the threshold counter runs out. - Lost updates possible. */ - (*adapt_count)--; - } - - /* Use a normal lock here. */ - return LLL_LOCK ((*futex), private); -} diff --git a/nptl/sysdeps/unix/sysv/linux/x86/elision-timed.c b/nptl/sysdeps/unix/sysv/linux/x86/elision-timed.c deleted file mode 100644 index 4fdaa0f9e9..0000000000 --- a/nptl/sysdeps/unix/sysv/linux/x86/elision-timed.c +++ /dev/null @@ -1,26 +0,0 @@ -/* elision-timed.c: Lock elision timed lock. - Copyright (C) 2013-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#include -#include -#include "lowlevellock.h" -#define __lll_lock_elision __lll_timedlock_elision -#define EXTRAARG const struct timespec *t, -#undef LLL_LOCK -#define LLL_LOCK(a, b) lll_timedlock(a, t, b) -#include "elision-lock.c" diff --git a/nptl/sysdeps/unix/sysv/linux/x86/elision-trylock.c b/nptl/sysdeps/unix/sysv/linux/x86/elision-trylock.c deleted file mode 100644 index a478ac18e3..0000000000 --- a/nptl/sysdeps/unix/sysv/linux/x86/elision-trylock.c +++ /dev/null @@ -1,71 +0,0 @@ -/* elision-trylock.c: Lock eliding trylock for pthreads. - Copyright (C) 2013-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#include -#include -#include -#include "hle.h" -#include - -#define aconf __elision_aconf - -/* Try to elide a futex trylock. FUTEX is the futex variable. ADAPT_COUNT is - the adaptation counter in the mutex. */ - -int -__lll_trylock_elision (int *futex, short *adapt_count) -{ - /* Implement POSIX semantics by forbiding nesting - trylock. Sorry. After the abort the code is re-executed - non transactional and if the lock was already locked - return an error. */ - _xabort (_ABORT_NESTED_TRYLOCK); - - /* Only try a transaction if it's worth it. */ - if (*adapt_count <= 0) - { - unsigned status; - - if ((status = _xbegin()) == _XBEGIN_STARTED) - { - if (*futex == 0) - return 0; - - /* Lock was busy. Fall back to normal locking. - Could also _xend here but xabort with 0xff code - is more visible in the profiler. */ - _xabort (_ABORT_LOCK_BUSY); - } - - if (!(status & _XABORT_RETRY)) - { - /* Internal abort. No chance for retry. For future - locks don't try speculation for some time. */ - if (*adapt_count != aconf.skip_trylock_internal_abort) - *adapt_count = aconf.skip_trylock_internal_abort; - } - /* Could do some retries here. */ - } - else - { - /* Lost updates are possible, but harmless. */ - (*adapt_count)--; - } - - return lll_trylock (*futex); -} diff --git a/nptl/sysdeps/unix/sysv/linux/x86/elision-unlock.c b/nptl/sysdeps/unix/sysv/linux/x86/elision-unlock.c deleted file mode 100644 index b9be19ccc4..0000000000 --- a/nptl/sysdeps/unix/sysv/linux/x86/elision-unlock.c +++ /dev/null @@ -1,33 +0,0 @@ -/* elision-unlock.c: Commit an elided pthread lock. - Copyright (C) 2013-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#include "pthreadP.h" -#include "lowlevellock.h" -#include "hle.h" - -int -__lll_unlock_elision(int *lock, int private) -{ - /* When the lock was free we're in a transaction. - When you crash here you unlocked a free lock. */ - if (*lock == 0) - _xend(); - else - lll_unlock ((*lock), private); - return 0; -} diff --git a/nptl/sysdeps/unix/sysv/linux/x86/force-elision.h b/nptl/sysdeps/unix/sysv/linux/x86/force-elision.h deleted file mode 100644 index 945f8867fc..0000000000 --- a/nptl/sysdeps/unix/sysv/linux/x86/force-elision.h +++ /dev/null @@ -1,31 +0,0 @@ -/* force-elision.h: Automatic enabling of elision for mutexes - Copyright (C) 2013-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -/* Check for elision on this lock without upgrading. */ -#define DO_ELISION(m) \ - (__pthread_force_elision \ - && (m->__data.__kind & PTHREAD_MUTEX_NO_ELISION_NP) == 0) \ - -/* Automatically enable elision for existing user lock kinds. */ -#define FORCE_ELISION(m, s) \ - if (__pthread_force_elision \ - && (m->__data.__kind & PTHREAD_MUTEX_ELISION_FLAGS_NP) == 0) \ - { \ - mutex->__data.__kind |= PTHREAD_MUTEX_ELISION_NP; \ - s; \ - } diff --git a/nptl/sysdeps/unix/sysv/linux/x86/hle.h b/nptl/sysdeps/unix/sysv/linux/x86/hle.h deleted file mode 100644 index 4a7b9e3bf7..0000000000 --- a/nptl/sysdeps/unix/sysv/linux/x86/hle.h +++ /dev/null @@ -1,75 +0,0 @@ -/* Shared RTM header. Emulate TSX intrinsics for compilers and assemblers - that do not support the intrinsics and instructions yet. */ -#ifndef _HLE_H -#define _HLE_H 1 - -#ifdef __ASSEMBLER__ - -.macro XBEGIN target - .byte 0xc7,0xf8 - .long \target-1f -1: -.endm - -.macro XEND - .byte 0x0f,0x01,0xd5 -.endm - -.macro XABORT code - .byte 0xc6,0xf8,\code -.endm - -.macro XTEST - .byte 0x0f,0x01,0xd6 -.endm - -#endif - -/* Official RTM intrinsics interface matching gcc/icc, but works - on older gcc compatible compilers and binutils. - We should somehow detect if the compiler supports it, because - it may be able to generate slightly better code. */ - -#define _XBEGIN_STARTED (~0u) -#define _XABORT_EXPLICIT (1 << 0) -#define _XABORT_RETRY (1 << 1) -#define _XABORT_CONFLICT (1 << 2) -#define _XABORT_CAPACITY (1 << 3) -#define _XABORT_DEBUG (1 << 4) -#define _XABORT_NESTED (1 << 5) -#define _XABORT_CODE(x) (((x) >> 24) & 0xff) - -#define _ABORT_LOCK_BUSY 0xff -#define _ABORT_LOCK_IS_LOCKED 0xfe -#define _ABORT_NESTED_TRYLOCK 0xfd - -#ifndef __ASSEMBLER__ - -#define __force_inline __attribute__((__always_inline__)) inline - -static __force_inline int _xbegin(void) -{ - int ret = _XBEGIN_STARTED; - asm volatile (".byte 0xc7,0xf8 ; .long 0" : "+a" (ret) :: "memory"); - return ret; -} - -static __force_inline void _xend(void) -{ - asm volatile (".byte 0x0f,0x01,0xd5" ::: "memory"); -} - -static __force_inline void _xabort(const unsigned int status) -{ - asm volatile (".byte 0xc6,0xf8,%P0" :: "i" (status) : "memory"); -} - -static __force_inline int _xtest(void) -{ - unsigned char out; - asm volatile (".byte 0x0f,0x01,0xd6 ; setnz %0" : "=r" (out) :: "memory"); - return out; -} - -#endif -#endif diff --git a/nptl/sysdeps/unix/sysv/linux/x86/init-arch.c b/nptl/sysdeps/unix/sysv/linux/x86/init-arch.c deleted file mode 100644 index 00a94d83dc..0000000000 --- a/nptl/sysdeps/unix/sysv/linux/x86/init-arch.c +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/nptl/sysdeps/unix/sysv/linux/x86/init-arch.h b/nptl/sysdeps/unix/sysv/linux/x86/init-arch.h deleted file mode 100644 index cd2d0befee..0000000000 --- a/nptl/sysdeps/unix/sysv/linux/x86/init-arch.h +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/nptl/sysdeps/unix/sysv/linux/x86/pthread_mutex_cond_lock.c b/nptl/sysdeps/unix/sysv/linux/x86/pthread_mutex_cond_lock.c deleted file mode 100644 index 34c705235a..0000000000 --- a/nptl/sysdeps/unix/sysv/linux/x86/pthread_mutex_cond_lock.c +++ /dev/null @@ -1,22 +0,0 @@ -/* Copyright (C) 2013-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -/* The cond lock is not actually elided yet, but we still need to handle - already elided locks. */ -#include - -#include "sysdeps/unix/sysv/linux/pthread_mutex_cond_lock.c" diff --git a/nptl/sysdeps/unix/sysv/linux/x86/pthread_mutex_lock.c b/nptl/sysdeps/unix/sysv/linux/x86/pthread_mutex_lock.c deleted file mode 100644 index b8a33c1869..0000000000 --- a/nptl/sysdeps/unix/sysv/linux/x86/pthread_mutex_lock.c +++ /dev/null @@ -1,22 +0,0 @@ -/* Elided version of pthread_mutex_lock. - Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#include -#include "force-elision.h" - -#include "nptl/pthread_mutex_lock.c" diff --git a/nptl/sysdeps/unix/sysv/linux/x86/pthread_mutex_timedlock.c b/nptl/sysdeps/unix/sysv/linux/x86/pthread_mutex_timedlock.c deleted file mode 100644 index d33dd2a112..0000000000 --- a/nptl/sysdeps/unix/sysv/linux/x86/pthread_mutex_timedlock.c +++ /dev/null @@ -1,22 +0,0 @@ -/* Elided version of pthread_mutex_timedlock. - Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#include -#include "force-elision.h" - -#include "nptl/pthread_mutex_timedlock.c" diff --git a/nptl/sysdeps/unix/sysv/linux/x86/pthread_mutex_trylock.c b/nptl/sysdeps/unix/sysv/linux/x86/pthread_mutex_trylock.c deleted file mode 100644 index 6534e9693b..0000000000 --- a/nptl/sysdeps/unix/sysv/linux/x86/pthread_mutex_trylock.c +++ /dev/null @@ -1,22 +0,0 @@ -/* Elided version of pthread_mutex_trylock. - Copyright (C) 2011-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#include -#include "force-elision.h" - -#include "nptl/pthread_mutex_trylock.c" diff --git a/sysdeps/unix/sysv/linux/x86/Makefile b/sysdeps/unix/sysv/linux/x86/Makefile index 6412a9ef36..012125f30c 100644 --- a/sysdeps/unix/sysv/linux/x86/Makefile +++ b/sysdeps/unix/sysv/linux/x86/Makefile @@ -16,3 +16,9 @@ abi-x32-ld-soname := ld-linux-x32.so.2 ifeq ($(subdir),misc) sysdep_headers += sys/elf.h sys/perm.h sys/reg.h sys/vm86.h sys/debugreg.h sys/io.h endif + +ifeq ($(subdir),nptl) +libpthread-sysdep_routines += init-arch +libpthread-sysdep_routines += elision-lock elision-unlock elision-timed \ + elision-trylock +endif diff --git a/sysdeps/unix/sysv/linux/x86/elision-conf.c b/sysdeps/unix/sysv/linux/x86/elision-conf.c new file mode 100644 index 0000000000..e6f5d6d1ab --- /dev/null +++ b/sysdeps/unix/sysv/linux/x86/elision-conf.c @@ -0,0 +1,81 @@ +/* elision-conf.c: Lock elision tunable parameters. + Copyright (C) 2013-2014 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include "config.h" +#include +#include +#include +#include + +/* Reasonable initial tuning values, may be revised in the future. + This is a conservative initial value. */ + +struct elision_config __elision_aconf = + { + /* How often to not attempt to use elision if a transaction aborted + because the lock is already acquired. Expressed in number of lock + acquisition attempts. */ + .skip_lock_busy = 3, + /* How often to not attempt to use elision if a transaction aborted due + to reasons other than other threads' memory accesses. Expressed in + number of lock acquisition attempts. */ + .skip_lock_internal_abort = 3, + /* How often we retry using elision if there is chance for the transaction + to finish execution (e.g., it wasn't aborted due to the lock being + already acquired. */ + .retry_try_xbegin = 3, + /* Same as SKIP_LOCK_INTERNAL_ABORT but for trylock. */ + .skip_trylock_internal_abort = 3, + }; + +/* Set when the CPU supports elision. When false elision is never attempted. + */ + +int __elision_available attribute_hidden; + +/* Force elision for all new locks. This is used to decide whether existing + DEFAULT locks should be automatically upgraded to elision in + pthread_mutex_lock(). Disabled for suid programs. Only used when elision + is available. */ + +int __pthread_force_elision attribute_hidden; + +/* Initialize elison. */ + +static void +elision_init (int argc __attribute__ ((unused)), + char **argv __attribute__ ((unused)), + char **environ) +{ + __elision_available = HAS_RTM; +#ifdef ENABLE_LOCK_ELISION + __pthread_force_elision = __libc_enable_secure ? 0 : __elision_available; +#endif +} + +#ifdef SHARED +# define INIT_SECTION ".init_array" +#else +# define INIT_SECTION ".preinit_array" +#endif + +void (*const __pthread_init_array []) (int, char **, char **) + __attribute__ ((section (INIT_SECTION), aligned (sizeof (void *)))) = +{ + &elision_init +}; diff --git a/sysdeps/unix/sysv/linux/x86/elision-conf.h b/sysdeps/unix/sysv/linux/x86/elision-conf.h new file mode 100644 index 0000000000..6790b5aa13 --- /dev/null +++ b/sysdeps/unix/sysv/linux/x86/elision-conf.h @@ -0,0 +1,43 @@ +/* elision-conf.h: Lock elision tunable parameters. + Copyright (C) 2013-2014 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ +#ifndef _ELISION_CONF_H +#define _ELISION_CONF_H 1 + +#include +#include +#include + +/* Should make sure there is no false sharing on this. */ + +struct elision_config +{ + int skip_lock_busy; + int skip_lock_internal_abort; + int retry_try_xbegin; + int skip_trylock_internal_abort; +}; + +extern struct elision_config __elision_aconf attribute_hidden; + +extern int __elision_available attribute_hidden; +extern int __pthread_force_elision attribute_hidden; + +/* Tell the test suite to test elision for this architecture. */ +#define HAVE_ELISION 1 + +#endif diff --git a/sysdeps/unix/sysv/linux/x86/elision-lock.c b/sysdeps/unix/sysv/linux/x86/elision-lock.c new file mode 100644 index 0000000000..385ac31a52 --- /dev/null +++ b/sysdeps/unix/sysv/linux/x86/elision-lock.c @@ -0,0 +1,95 @@ +/* elision-lock.c: Elided pthread mutex lock. + Copyright (C) 2011-2014 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include "pthreadP.h" +#include "lowlevellock.h" +#include "hle.h" +#include + +#if !defined(LLL_LOCK) && !defined(EXTRAARG) +/* Make sure the configuration code is always linked in for static + libraries. */ +#include "elision-conf.c" +#endif + +#ifndef EXTRAARG +#define EXTRAARG +#endif +#ifndef LLL_LOCK +#define LLL_LOCK(a,b) lll_lock(a,b), 0 +#endif + +#define aconf __elision_aconf + +/* Adaptive lock using transactions. + By default the lock region is run as a transaction, and when it + aborts or the lock is busy the lock adapts itself. */ + +int +__lll_lock_elision (int *futex, short *adapt_count, EXTRAARG int private) +{ + if (*adapt_count <= 0) + { + unsigned status; + int try_xbegin; + + for (try_xbegin = aconf.retry_try_xbegin; + try_xbegin > 0; + try_xbegin--) + { + if ((status = _xbegin()) == _XBEGIN_STARTED) + { + if (*futex == 0) + return 0; + + /* Lock was busy. Fall back to normal locking. + Could also _xend here but xabort with 0xff code + is more visible in the profiler. */ + _xabort (_ABORT_LOCK_BUSY); + } + + if (!(status & _XABORT_RETRY)) + { + if ((status & _XABORT_EXPLICIT) + && _XABORT_CODE (status) == _ABORT_LOCK_BUSY) + { + /* Right now we skip here. Better would be to wait a bit + and retry. This likely needs some spinning. */ + if (*adapt_count != aconf.skip_lock_busy) + *adapt_count = aconf.skip_lock_busy; + } + /* Internal abort. There is no chance for retry. + Use the normal locking and next time use lock. + Be careful to avoid writing to the lock. */ + else if (*adapt_count != aconf.skip_lock_internal_abort) + *adapt_count = aconf.skip_lock_internal_abort; + break; + } + } + } + else + { + /* Use a normal lock until the threshold counter runs out. + Lost updates possible. */ + (*adapt_count)--; + } + + /* Use a normal lock here. */ + return LLL_LOCK ((*futex), private); +} diff --git a/sysdeps/unix/sysv/linux/x86/elision-timed.c b/sysdeps/unix/sysv/linux/x86/elision-timed.c new file mode 100644 index 0000000000..4fdaa0f9e9 --- /dev/null +++ b/sysdeps/unix/sysv/linux/x86/elision-timed.c @@ -0,0 +1,26 @@ +/* elision-timed.c: Lock elision timed lock. + Copyright (C) 2013-2014 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include +#include "lowlevellock.h" +#define __lll_lock_elision __lll_timedlock_elision +#define EXTRAARG const struct timespec *t, +#undef LLL_LOCK +#define LLL_LOCK(a, b) lll_timedlock(a, t, b) +#include "elision-lock.c" diff --git a/sysdeps/unix/sysv/linux/x86/elision-trylock.c b/sysdeps/unix/sysv/linux/x86/elision-trylock.c new file mode 100644 index 0000000000..a478ac18e3 --- /dev/null +++ b/sysdeps/unix/sysv/linux/x86/elision-trylock.c @@ -0,0 +1,71 @@ +/* elision-trylock.c: Lock eliding trylock for pthreads. + Copyright (C) 2013-2014 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include +#include +#include "hle.h" +#include + +#define aconf __elision_aconf + +/* Try to elide a futex trylock. FUTEX is the futex variable. ADAPT_COUNT is + the adaptation counter in the mutex. */ + +int +__lll_trylock_elision (int *futex, short *adapt_count) +{ + /* Implement POSIX semantics by forbiding nesting + trylock. Sorry. After the abort the code is re-executed + non transactional and if the lock was already locked + return an error. */ + _xabort (_ABORT_NESTED_TRYLOCK); + + /* Only try a transaction if it's worth it. */ + if (*adapt_count <= 0) + { + unsigned status; + + if ((status = _xbegin()) == _XBEGIN_STARTED) + { + if (*futex == 0) + return 0; + + /* Lock was busy. Fall back to normal locking. + Could also _xend here but xabort with 0xff code + is more visible in the profiler. */ + _xabort (_ABORT_LOCK_BUSY); + } + + if (!(status & _XABORT_RETRY)) + { + /* Internal abort. No chance for retry. For future + locks don't try speculation for some time. */ + if (*adapt_count != aconf.skip_trylock_internal_abort) + *adapt_count = aconf.skip_trylock_internal_abort; + } + /* Could do some retries here. */ + } + else + { + /* Lost updates are possible, but harmless. */ + (*adapt_count)--; + } + + return lll_trylock (*futex); +} diff --git a/sysdeps/unix/sysv/linux/x86/elision-unlock.c b/sysdeps/unix/sysv/linux/x86/elision-unlock.c new file mode 100644 index 0000000000..b9be19ccc4 --- /dev/null +++ b/sysdeps/unix/sysv/linux/x86/elision-unlock.c @@ -0,0 +1,33 @@ +/* elision-unlock.c: Commit an elided pthread lock. + Copyright (C) 2013-2014 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include "pthreadP.h" +#include "lowlevellock.h" +#include "hle.h" + +int +__lll_unlock_elision(int *lock, int private) +{ + /* When the lock was free we're in a transaction. + When you crash here you unlocked a free lock. */ + if (*lock == 0) + _xend(); + else + lll_unlock ((*lock), private); + return 0; +} diff --git a/sysdeps/unix/sysv/linux/x86/force-elision.h b/sysdeps/unix/sysv/linux/x86/force-elision.h new file mode 100644 index 0000000000..945f8867fc --- /dev/null +++ b/sysdeps/unix/sysv/linux/x86/force-elision.h @@ -0,0 +1,31 @@ +/* force-elision.h: Automatic enabling of elision for mutexes + Copyright (C) 2013-2014 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +/* Check for elision on this lock without upgrading. */ +#define DO_ELISION(m) \ + (__pthread_force_elision \ + && (m->__data.__kind & PTHREAD_MUTEX_NO_ELISION_NP) == 0) \ + +/* Automatically enable elision for existing user lock kinds. */ +#define FORCE_ELISION(m, s) \ + if (__pthread_force_elision \ + && (m->__data.__kind & PTHREAD_MUTEX_ELISION_FLAGS_NP) == 0) \ + { \ + mutex->__data.__kind |= PTHREAD_MUTEX_ELISION_NP; \ + s; \ + } diff --git a/sysdeps/unix/sysv/linux/x86/hle.h b/sysdeps/unix/sysv/linux/x86/hle.h new file mode 100644 index 0000000000..4a7b9e3bf7 --- /dev/null +++ b/sysdeps/unix/sysv/linux/x86/hle.h @@ -0,0 +1,75 @@ +/* Shared RTM header. Emulate TSX intrinsics for compilers and assemblers + that do not support the intrinsics and instructions yet. */ +#ifndef _HLE_H +#define _HLE_H 1 + +#ifdef __ASSEMBLER__ + +.macro XBEGIN target + .byte 0xc7,0xf8 + .long \target-1f +1: +.endm + +.macro XEND + .byte 0x0f,0x01,0xd5 +.endm + +.macro XABORT code + .byte 0xc6,0xf8,\code +.endm + +.macro XTEST + .byte 0x0f,0x01,0xd6 +.endm + +#endif + +/* Official RTM intrinsics interface matching gcc/icc, but works + on older gcc compatible compilers and binutils. + We should somehow detect if the compiler supports it, because + it may be able to generate slightly better code. */ + +#define _XBEGIN_STARTED (~0u) +#define _XABORT_EXPLICIT (1 << 0) +#define _XABORT_RETRY (1 << 1) +#define _XABORT_CONFLICT (1 << 2) +#define _XABORT_CAPACITY (1 << 3) +#define _XABORT_DEBUG (1 << 4) +#define _XABORT_NESTED (1 << 5) +#define _XABORT_CODE(x) (((x) >> 24) & 0xff) + +#define _ABORT_LOCK_BUSY 0xff +#define _ABORT_LOCK_IS_LOCKED 0xfe +#define _ABORT_NESTED_TRYLOCK 0xfd + +#ifndef __ASSEMBLER__ + +#define __force_inline __attribute__((__always_inline__)) inline + +static __force_inline int _xbegin(void) +{ + int ret = _XBEGIN_STARTED; + asm volatile (".byte 0xc7,0xf8 ; .long 0" : "+a" (ret) :: "memory"); + return ret; +} + +static __force_inline void _xend(void) +{ + asm volatile (".byte 0x0f,0x01,0xd5" ::: "memory"); +} + +static __force_inline void _xabort(const unsigned int status) +{ + asm volatile (".byte 0xc6,0xf8,%P0" :: "i" (status) : "memory"); +} + +static __force_inline int _xtest(void) +{ + unsigned char out; + asm volatile (".byte 0x0f,0x01,0xd6 ; setnz %0" : "=r" (out) :: "memory"); + return out; +} + +#endif +#endif diff --git a/sysdeps/unix/sysv/linux/x86/init-arch.c b/sysdeps/unix/sysv/linux/x86/init-arch.c new file mode 100644 index 0000000000..00a94d83dc --- /dev/null +++ b/sysdeps/unix/sysv/linux/x86/init-arch.c @@ -0,0 +1 @@ +#include diff --git a/sysdeps/unix/sysv/linux/x86/init-arch.h b/sysdeps/unix/sysv/linux/x86/init-arch.h new file mode 100644 index 0000000000..cd2d0befee --- /dev/null +++ b/sysdeps/unix/sysv/linux/x86/init-arch.h @@ -0,0 +1 @@ +#include diff --git a/sysdeps/unix/sysv/linux/x86/pthread_mutex_cond_lock.c b/sysdeps/unix/sysv/linux/x86/pthread_mutex_cond_lock.c new file mode 100644 index 0000000000..34c705235a --- /dev/null +++ b/sysdeps/unix/sysv/linux/x86/pthread_mutex_cond_lock.c @@ -0,0 +1,22 @@ +/* Copyright (C) 2013-2014 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +/* The cond lock is not actually elided yet, but we still need to handle + already elided locks. */ +#include + +#include "sysdeps/unix/sysv/linux/pthread_mutex_cond_lock.c" diff --git a/sysdeps/unix/sysv/linux/x86/pthread_mutex_lock.c b/sysdeps/unix/sysv/linux/x86/pthread_mutex_lock.c new file mode 100644 index 0000000000..b8a33c1869 --- /dev/null +++ b/sysdeps/unix/sysv/linux/x86/pthread_mutex_lock.c @@ -0,0 +1,22 @@ +/* Elided version of pthread_mutex_lock. + Copyright (C) 2011-2014 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include "force-elision.h" + +#include "nptl/pthread_mutex_lock.c" diff --git a/sysdeps/unix/sysv/linux/x86/pthread_mutex_timedlock.c b/sysdeps/unix/sysv/linux/x86/pthread_mutex_timedlock.c new file mode 100644 index 0000000000..d33dd2a112 --- /dev/null +++ b/sysdeps/unix/sysv/linux/x86/pthread_mutex_timedlock.c @@ -0,0 +1,22 @@ +/* Elided version of pthread_mutex_timedlock. + Copyright (C) 2011-2014 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include "force-elision.h" + +#include "nptl/pthread_mutex_timedlock.c" diff --git a/sysdeps/unix/sysv/linux/x86/pthread_mutex_trylock.c b/sysdeps/unix/sysv/linux/x86/pthread_mutex_trylock.c new file mode 100644 index 0000000000..6534e9693b --- /dev/null +++ b/sysdeps/unix/sysv/linux/x86/pthread_mutex_trylock.c @@ -0,0 +1,22 @@ +/* Elided version of pthread_mutex_trylock. + Copyright (C) 2011-2014 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include "force-elision.h" + +#include "nptl/pthread_mutex_trylock.c" -- cgit 1.4.1