mirror of
git://sourceware.org/git/glibc.git
synced 2024-11-21 01:12:26 +08:00
* init.c (__pthread_initialize_minimal_internal): Optimize test
FUTEX_CLOCK_REALTIME a bit.
This commit is contained in:
parent
a9fa090b02
commit
3c612057ae
@ -1,3 +1,8 @@
|
||||
2009-01-04 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* init.c (__pthread_initialize_minimal_internal): Optimize test
|
||||
FUTEX_CLOCK_REALTIME a bit.
|
||||
|
||||
2009-01-03 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* init.c (__pthread_initialize_minimal_internal): Cheat a bit by
|
||||
|
36
nptl/init.c
36
nptl/init.c
@ -300,24 +300,28 @@ __pthread_initialize_minimal_internal (void)
|
||||
if (!INTERNAL_SYSCALL_ERROR_P (word, err))
|
||||
THREAD_SETMEM (pd, header.private_futex, FUTEX_PRIVATE_FLAG);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Private futexes have been introduced earlier than the
|
||||
FUTEX_CLOCK_REALTIME flag. We don't have to run the test if we
|
||||
know the former are not supported. This also means we know the
|
||||
kernel will return ENOSYS for unknown operations. */
|
||||
if (THREAD_GETMEM (pd, header.private_futex) != 0)
|
||||
#endif
|
||||
#ifndef __ASSUME_FUTEX_CLOCK_REALTIME
|
||||
{
|
||||
int word = 0;
|
||||
/* NB: the syscall actually takes six parameters. The last is the
|
||||
bit mask. But since we will not actually wait at all the value
|
||||
is irrelevant. Given that passing six parameters is difficult
|
||||
on some architectures we just pass whatever random value the
|
||||
calling convention calls for to the kernel. It causes no harm. */
|
||||
word = INTERNAL_SYSCALL (futex, err, 5, &word,
|
||||
FUTEX_WAIT_BITSET | FUTEX_CLOCK_REALTIME
|
||||
| FUTEX_PRIVATE_FLAG, 1, NULL, 0);
|
||||
if (!INTERNAL_SYSCALL_ERROR_P (word, err)
|
||||
|| (INTERNAL_SYSCALL_ERRNO (word, err) != ENOSYS
|
||||
&& INTERNAL_SYSCALL_ERRNO (word, err) != EINVAL))
|
||||
__set_futex_clock_realtime ();
|
||||
}
|
||||
{
|
||||
int word = 0;
|
||||
/* NB: the syscall actually takes six parameters. The last is the
|
||||
bit mask. But since we will not actually wait at all the value
|
||||
is irrelevant. Given that passing six parameters is difficult
|
||||
on some architectures we just pass whatever random value the
|
||||
calling convention calls for to the kernel. It causes no harm. */
|
||||
word = INTERNAL_SYSCALL (futex, err, 5, &word,
|
||||
FUTEX_WAIT_BITSET | FUTEX_CLOCK_REALTIME
|
||||
| FUTEX_PRIVATE_FLAG, 1, NULL, 0);
|
||||
assert (INTERNAL_SYSCALL_ERROR_P (word, err));
|
||||
if (INTERNAL_SYSCALL_ERRNO (word, err) != ENOSYS)
|
||||
__set_futex_clock_realtime ();
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Set initial thread's stack block from 0 up to __libc_stack_end.
|
||||
|
Loading…
Reference in New Issue
Block a user