mirror of git://sourceware.org/git/glibc.git
NaCl: Add NaCl-specific __lll_timedlock_wait.
This commit is contained in:
parent
68c97aef62
commit
1f3a37b19c
|
@ -1,5 +1,7 @@
|
|||
2015-05-26 Roland McGrath <roland@hack.frob.com>
|
||||
|
||||
* sysdeps/nacl/lll_timedlock_wait.c: New file.
|
||||
|
||||
* nptl/lowlevellock.c (__lll_timedlock_wait): Moved ...
|
||||
* nptl/lll_timedlock_wait.c: ... to this new file.
|
||||
* nptl/Makefile (libpthread-routines): Add it.
|
||||
|
|
|
@ -0,0 +1,52 @@
|
|||
/* Timed low level locking for pthread library. NaCl version.
|
||||
Copyright (C) 2015 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
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <assert.h>
|
||||
#include <atomic.h>
|
||||
#include <errno.h>
|
||||
#include <lowlevellock.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
|
||||
/* This behaves the same as the generic version in nptl/. It's simpler
|
||||
because it doesn't need to convert an absolute timeout to a relative
|
||||
one (and back again in the lll_futex_timed_wait macro). */
|
||||
|
||||
int
|
||||
__lll_timedlock_wait (int *futex, const struct timespec *abstime, int private)
|
||||
{
|
||||
/* Reject invalid timeouts. */
|
||||
if (__glibc_unlikely (abstime->tv_nsec < 0)
|
||||
|| __glibc_unlikely (abstime->tv_nsec >= 1000000000))
|
||||
return EINVAL;
|
||||
|
||||
/* Try locking. */
|
||||
int result = 0;
|
||||
while (atomic_exchange_acq (futex, 2) != 0)
|
||||
{
|
||||
/* If *futex == 2, wait until woken or timeout. */
|
||||
result = __nacl_irt_futex.futex_wait_abs ((volatile int *) futex, 2,
|
||||
abstime);
|
||||
if (__glibc_likely (result == 0)
|
||||
|| __glibc_likely (result == ETIMEDOUT))
|
||||
break;
|
||||
assert (result == EAGAIN);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
Loading…
Reference in New Issue