mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-30 16:50:07 +00:00
dd037fb3df
This patch decrements the adapt_count while unlocking the futex instead of before aquiring the futex as it is done on power, too. Furthermore a transaction is only started if the futex is currently free. This check is done after starting the transaction, too. If the futex is not free and the transaction nesting depth is one, we can simply end the started transaction instead of aborting it. The implementation of this check was faulty as it always ended the started transaction. By using the fallback path, the the outermost transaction was aborted. Now the outermost transaction is aborted directly. This patch also adds some commentary and aligns the code in elision-trylock.c to the code in elision-lock.c as possible. ChangeLog: * sysdeps/unix/sysv/linux/s390/lowlevellock.h (__lll_unlock_elision, lll_unlock_elision): Add adapt_count argument. * sysdeps/unix/sysv/linux/s390/elision-lock.c: (__lll_lock_elision): Decrement adapt_count while unlocking instead of before locking. * sysdeps/unix/sysv/linux/s390/elision-trylock.c (__lll_trylock_elision): Likewise. * sysdeps/unix/sysv/linux/s390/elision-unlock.c: (__lll_unlock_elision): Likewise.
51 lines
1.9 KiB
C
51 lines
1.9 KiB
C
/* Copyright (C) 2003-2016 Free Software Foundation, Inc.
|
|
This file is part of the GNU C Library.
|
|
Contributed by Martin Schwidefsky <schwidefsky@de.ibm.com>, 2003.
|
|
|
|
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
|
|
<http://www.gnu.org/licenses/>. */
|
|
|
|
#ifndef _S390_LOWLEVELLOCK_H
|
|
#define _S390_LOWLEVELLOCK_H 1
|
|
|
|
#include <sysdeps/nptl/lowlevellock.h>
|
|
|
|
/* Transactional lock elision definitions. */
|
|
# ifdef ENABLE_LOCK_ELISION
|
|
extern int __lll_timedlock_elision
|
|
(int *futex, short *adapt_count, const struct timespec *timeout, int private)
|
|
attribute_hidden;
|
|
|
|
# define lll_timedlock_elision(futex, adapt_count, timeout, private) \
|
|
__lll_timedlock_elision(&(futex), &(adapt_count), timeout, private)
|
|
|
|
extern int __lll_lock_elision (int *futex, short *adapt_count, int private)
|
|
attribute_hidden;
|
|
|
|
extern int __lll_unlock_elision(int *futex, short *adapt_count, int private)
|
|
attribute_hidden;
|
|
|
|
extern int __lll_trylock_elision(int *futex, short *adapt_count)
|
|
attribute_hidden;
|
|
|
|
# define lll_lock_elision(futex, adapt_count, private) \
|
|
__lll_lock_elision (&(futex), &(adapt_count), private)
|
|
# define lll_unlock_elision(futex, adapt_count, private) \
|
|
__lll_unlock_elision (&(futex), &(adapt_count), private)
|
|
# define lll_trylock_elision(futex, adapt_count) \
|
|
__lll_trylock_elision(&(futex), &(adapt_count))
|
|
# endif /* ENABLE_LOCK_ELISION */
|
|
|
|
#endif /* lowlevellock.h */
|