diff options
author | Roland McGrath <roland@hack.frob.com> | 2015-05-28 15:37:31 -0700 |
---|---|---|
committer | Roland McGrath <roland@hack.frob.com> | 2015-05-28 15:37:31 -0700 |
commit | 3ed015122f159b4fade8e4feecb53fe1f84fa95f (patch) | |
tree | 328027f6ca9b89c9afcd76443863063182b68ea9 /sysdeps/nacl/lll_timedwait_tid.c | |
parent | f21754707cf42f18523aafdaad88b8ef3c317e37 (diff) | |
download | glibc-3ed015122f159b4fade8e4feecb53fe1f84fa95f.tar.gz glibc-3ed015122f159b4fade8e4feecb53fe1f84fa95f.tar.xz glibc-3ed015122f159b4fade8e4feecb53fe1f84fa95f.zip |
NaCl: Make thread exit wake pthread_join.
Diffstat (limited to 'sysdeps/nacl/lll_timedwait_tid.c')
-rw-r--r-- | sysdeps/nacl/lll_timedwait_tid.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/sysdeps/nacl/lll_timedwait_tid.c b/sysdeps/nacl/lll_timedwait_tid.c new file mode 100644 index 0000000000..ecaf0b113a --- /dev/null +++ b/sysdeps/nacl/lll_timedwait_tid.c @@ -0,0 +1,61 @@ +/* Timed waiting for thread death. 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> + +int +__lll_timedwait_tid (int *tidp, const struct timespec *abstime) +{ + /* Reject invalid timeouts. */ + if (__glibc_unlikely (abstime->tv_nsec < 0) + || __glibc_unlikely (abstime->tv_nsec >= 1000000000)) + return EINVAL; + + /* Repeat until thread terminated. */ + int tid; + while ((tid = atomic_load_relaxed (tidp)) != 0) + { + /* See exit-thread.h for details. */ + if (tid == NACL_EXITING_TID) + /* The thread should now be in the process of exiting, so it will + finish quick enough that the timeout doesn't matter. If any + thread ever stays in this state for long, there is something + catastrophically wrong. */ + BUSY_WAIT_NOP; + else + { + assert (tid > 0); + + /* If *FUTEX == TID, wait until woken or timeout. */ + int err = __nacl_irt_futex.futex_wait_abs ((volatile int *) tidp, + tid, abstime); + if (err != 0) + { + if (__glibc_likely (err == ETIMEDOUT)) + return err; + assert (err == EAGAIN); + } + } + } + + return 0; +} |