Assume LLL_LOCK_INITIALIZER is 0

Since hppa is not an outlier anymore regarding LLL_LOCK_INITIALIZER value,
we can now assume it 0 for all architectures.

Checked on a build for all major ABIs.

	* nptl/nptl-init.c (__pthread_initialize_minimal_internal): Remove
	initialization for LLL_LOCK_INITIALIZER different than 0.
	* nptl/old_pthread_cond_broadcast.c (__pthread_cond_broadcast_2_0):
	Assume LLL_LOCK_INITIALIZER being 0.
	* nptl/old_pthread_cond_signal.c (__pthread_cond_signal_2_0): Likewise.
	* nptl/old_pthread_cond_timedwait.c (__pthread_cond_timedwait_2_0):
	Likewise.
	* nptl/old_pthread_cond_wait.c (__pthread_cond_wait_2_0): Likewise.
	* sysdeps/nptl/libc-lockP.h (__libc_lock_define_initialized): Likewise.
This commit is contained in:
Adhemerval Zanella 2019-02-22 12:10:26 -03:00
parent d7e4c642ef
commit 959aff9fa2
7 changed files with 13 additions and 52 deletions

View File

@ -1,5 +1,15 @@
2019-05-14 Adhemerval Zanella <adhemerval.zanella@linaro.org> 2019-05-14 Adhemerval Zanella <adhemerval.zanella@linaro.org>
* nptl/nptl-init.c (__pthread_initialize_minimal_internal): Remove
initialization for LLL_LOCK_INITIALIZER different than 0.
* nptl/old_pthread_cond_broadcast.c (__pthread_cond_broadcast_2_0):
Assume LLL_LOCK_INITIALIZER being 0.
* nptl/old_pthread_cond_signal.c (__pthread_cond_signal_2_0): Likewise.
* nptl/old_pthread_cond_timedwait.c (__pthread_cond_timedwait_2_0):
Likewise.
* nptl/old_pthread_cond_wait.c (__pthread_cond_wait_2_0): Likewise.
* sysdeps/nptl/libc-lockP.h (__libc_lock_define_initialized): Likewise.
* nptl/lowlevellock.c (__lll_lock_wait, __lll_lock_wait_private): * nptl/lowlevellock.c (__lll_lock_wait, __lll_lock_wait_private):
Optimize futex call and add systemtap probe. Optimize futex call and add systemtap probe.

View File

@ -265,8 +265,6 @@ __pthread_initialize_minimal_internal (void)
__pthread_initialize_pids (pd); __pthread_initialize_pids (pd);
THREAD_SETMEM (pd, specific[0], &pd->specific_1stblock[0]); THREAD_SETMEM (pd, specific[0], &pd->specific_1stblock[0]);
THREAD_SETMEM (pd, user_stack, true); THREAD_SETMEM (pd, user_stack, true);
if (LLL_LOCK_INITIALIZER != 0)
THREAD_SETMEM (pd, lock, LLL_LOCK_INITIALIZER);
/* Initialize the robust mutex data. */ /* Initialize the robust mutex data. */
{ {

View File

@ -31,18 +31,9 @@ __pthread_cond_broadcast_2_0 (pthread_cond_2_0_t *cond)
{ {
pthread_cond_t *newcond; pthread_cond_t *newcond;
#if LLL_LOCK_INITIALIZER == 0
newcond = (pthread_cond_t *) calloc (sizeof (pthread_cond_t), 1); newcond = (pthread_cond_t *) calloc (sizeof (pthread_cond_t), 1);
if (newcond == NULL) if (newcond == NULL)
return ENOMEM; return ENOMEM;
#else
newcond = (pthread_cond_t *) malloc (sizeof (pthread_cond_t));
if (newcond == NULL)
return ENOMEM;
/* Initialize the condvar. */
(void) pthread_cond_init (newcond, NULL);
#endif
if (atomic_compare_and_exchange_bool_acq (&cond->cond, newcond, NULL)) if (atomic_compare_and_exchange_bool_acq (&cond->cond, newcond, NULL))
/* Somebody else just initialized the condvar. */ /* Somebody else just initialized the condvar. */

View File

@ -31,18 +31,9 @@ __pthread_cond_signal_2_0 (pthread_cond_2_0_t *cond)
{ {
pthread_cond_t *newcond; pthread_cond_t *newcond;
#if LLL_LOCK_INITIALIZER == 0
newcond = (pthread_cond_t *) calloc (sizeof (pthread_cond_t), 1); newcond = (pthread_cond_t *) calloc (sizeof (pthread_cond_t), 1);
if (newcond == NULL) if (newcond == NULL)
return ENOMEM; return ENOMEM;
#else
newcond = (pthread_cond_t *) malloc (sizeof (pthread_cond_t));
if (newcond == NULL)
return ENOMEM;
/* Initialize the condvar. */
(void) pthread_cond_init (newcond, NULL);
#endif
if (atomic_compare_and_exchange_bool_acq (&cond->cond, newcond, NULL)) if (atomic_compare_and_exchange_bool_acq (&cond->cond, newcond, NULL))
/* Somebody else just initialized the condvar. */ /* Somebody else just initialized the condvar. */

View File

@ -32,18 +32,9 @@ __pthread_cond_timedwait_2_0 (pthread_cond_2_0_t *cond, pthread_mutex_t *mutex,
{ {
pthread_cond_t *newcond; pthread_cond_t *newcond;
#if LLL_LOCK_INITIALIZER == 0
newcond = (pthread_cond_t *) calloc (sizeof (pthread_cond_t), 1); newcond = (pthread_cond_t *) calloc (sizeof (pthread_cond_t), 1);
if (newcond == NULL) if (newcond == NULL)
return ENOMEM; return ENOMEM;
#else
newcond = (pthread_cond_t *) malloc (sizeof (pthread_cond_t));
if (newcond == NULL)
return ENOMEM;
/* Initialize the condvar. */
(void) pthread_cond_init (newcond, NULL);
#endif
if (atomic_compare_and_exchange_bool_acq (&cond->cond, newcond, NULL)) if (atomic_compare_and_exchange_bool_acq (&cond->cond, newcond, NULL))
/* Somebody else just initialized the condvar. */ /* Somebody else just initialized the condvar. */

View File

@ -31,18 +31,9 @@ __pthread_cond_wait_2_0 (pthread_cond_2_0_t *cond, pthread_mutex_t *mutex)
{ {
pthread_cond_t *newcond; pthread_cond_t *newcond;
#if LLL_LOCK_INITIALIZER == 0
newcond = (pthread_cond_t *) calloc (sizeof (pthread_cond_t), 1); newcond = (pthread_cond_t *) calloc (sizeof (pthread_cond_t), 1);
if (newcond == NULL) if (newcond == NULL)
return ENOMEM; return ENOMEM;
#else
newcond = (pthread_cond_t *) malloc (sizeof (pthread_cond_t));
if (newcond == NULL)
return ENOMEM;
/* Initialize the condvar. */
(void) pthread_cond_init (newcond, NULL);
#endif
if (atomic_compare_and_exchange_bool_acq (&cond->cond, newcond, NULL)) if (atomic_compare_and_exchange_bool_acq (&cond->cond, newcond, NULL))
/* Somebody else just initialized the condvar. */ /* Somebody else just initialized the condvar. */

View File

@ -71,23 +71,12 @@ typedef pthread_key_t __libc_key_t;
For the C library we take a deeper look at the initializer. For For the C library we take a deeper look at the initializer. For
this implementation all fields are initialized to zero. Therefore this implementation all fields are initialized to zero. Therefore
we don't initialize the variable which allows putting it into the we don't initialize the variable which allows putting it into the
BSS section. (Except on PA-RISC and other odd architectures, where BSS section. */
initialized locks must be set to one due to the lack of normal
atomic operations.) */
_Static_assert (LLL_LOCK_INITIALIZER == 0, "LLL_LOCK_INITIALIZER != 0");
#define _LIBC_LOCK_INITIALIZER LLL_LOCK_INITIALIZER #define _LIBC_LOCK_INITIALIZER LLL_LOCK_INITIALIZER
#if IS_IN (libc) || IS_IN (libpthread) #define __libc_lock_define_initialized(CLASS,NAME) \
# if LLL_LOCK_INITIALIZER == 0
# define __libc_lock_define_initialized(CLASS,NAME) \
CLASS __libc_lock_t NAME; CLASS __libc_lock_t NAME;
# else
# define __libc_lock_define_initialized(CLASS,NAME) \
CLASS __libc_lock_t NAME = LLL_LOCK_INITIALIZER;
# endif
#else
# define __libc_lock_define_initialized(CLASS,NAME) \
CLASS __libc_lock_t NAME;
#endif
#define __libc_rwlock_define_initialized(CLASS,NAME) \ #define __libc_rwlock_define_initialized(CLASS,NAME) \
CLASS __libc_rwlock_t NAME = PTHREAD_RWLOCK_INITIALIZER; CLASS __libc_rwlock_t NAME = PTHREAD_RWLOCK_INITIALIZER;