diff options
Diffstat (limited to 'sysdeps/unix/sysv/linux')
-rw-r--r-- | sysdeps/unix/sysv/linux/arm/libpthread.abilist | 3 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/arm/librt.abilist | 1 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/futex-internal.h | 123 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/lowlevellock-futex.h | 22 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist | 3 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/powerpc/powerpc32/librt.abilist | 1 |
6 files changed, 153 insertions, 0 deletions
diff --git a/sysdeps/unix/sysv/linux/arm/libpthread.abilist b/sysdeps/unix/sysv/linux/arm/libpthread.abilist index af82a4c632..e1a2ade0a3 100644 --- a/sysdeps/unix/sysv/linux/arm/libpthread.abilist +++ b/sysdeps/unix/sysv/linux/arm/libpthread.abilist @@ -27,6 +27,9 @@ GLIBC_2.28 tss_create F GLIBC_2.28 tss_delete F GLIBC_2.28 tss_get F GLIBC_2.28 tss_set F +GLIBC_2.29 __pthread_cond_timedwait64 F +GLIBC_2.29 __pthread_mutex_timedlock64 F +GLIBC_2.29 __sem_timedwait64 F GLIBC_2.4 _IO_flockfile F GLIBC_2.4 _IO_ftrylockfile F GLIBC_2.4 _IO_funlockfile F diff --git a/sysdeps/unix/sysv/linux/arm/librt.abilist b/sysdeps/unix/sysv/linux/arm/librt.abilist index 58e5f4baa1..88b61f3f66 100644 --- a/sysdeps/unix/sysv/linux/arm/librt.abilist +++ b/sysdeps/unix/sysv/linux/arm/librt.abilist @@ -1,3 +1,4 @@ +GLIBC_2.29 __aio_suspend64 F GLIBC_2.29 __mq_timedreceive64 F GLIBC_2.29 __mq_timedsend_time64 F GLIBC_2.29 __timer_gettime64 F diff --git a/sysdeps/unix/sysv/linux/futex-internal.h b/sysdeps/unix/sysv/linux/futex-internal.h index 96a07b05b9..484c8be56c 100644 --- a/sysdeps/unix/sysv/linux/futex-internal.h +++ b/sysdeps/unix/sysv/linux/futex-internal.h @@ -131,6 +131,32 @@ futex_reltimed_wait (unsigned int *futex_word, unsigned int expected, } } +/* 64-bit time version */ +static __always_inline int +futex_reltimed_wait64 (unsigned int *futex_word, unsigned int expected, + const struct __timespec64 *reltime, int private) +{ + int err = lll_futex_timed_wait64 (futex_word, expected, reltime, + private); + switch (err) + { + case 0: + case -EAGAIN: + case -EINTR: + case -ETIMEDOUT: + return -err; + + case -EFAULT: /* Must have been caused by a glibc or application bug. */ + case -EINVAL: /* Either due to wrong alignment or due to the timeout not + being normalized. Must have been caused by a glibc or + application bug. */ + case -ENOSYS: /* Must have been caused by a glibc bug. */ + /* No other errors are documented at this time. */ + default: + futex_fatal_error (); + } +} + /* See sysdeps/nptl/futex-internal.h for details. */ static __always_inline int futex_reltimed_wait_cancelable (unsigned int *futex_word, @@ -160,6 +186,37 @@ futex_reltimed_wait_cancelable (unsigned int *futex_word, } } +/* 64-bit time version */ + +static __always_inline int +futex_reltimed_wait_cancelable64 (unsigned int *futex_word, + unsigned int expected, + const struct __timespec64 *reltime, + int private) +{ + int oldtype; + oldtype = __pthread_enable_asynccancel (); + int err = lll_futex_timed_wait64 (futex_word, expected, reltime, private); + __pthread_disable_asynccancel (oldtype); + switch (err) + { + case 0: + case -EAGAIN: + case -EINTR: + case -ETIMEDOUT: + return -err; + + case -EFAULT: /* Must have been caused by a glibc or application bug. */ + case -EINVAL: /* Either due to wrong alignment or due to the timeout not + being normalized. Must have been caused by a glibc or + application bug. */ + case -ENOSYS: /* Must have been caused by a glibc bug. */ + /* No other errors are documented at this time. */ + default: + futex_fatal_error (); + } +} + /* See sysdeps/nptl/futex-internal.h for details. */ static __always_inline int futex_abstimed_wait (unsigned int *futex_word, unsigned int expected, @@ -190,6 +247,36 @@ futex_abstimed_wait (unsigned int *futex_word, unsigned int expected, } } +/* 64-bit time version */ +static __always_inline int +futex_abstimed_wait64 (unsigned int *futex_word, unsigned int expected, + const struct __timespec64 *abstime, int private) +{ + /* Work around the fact that the kernel rejects negative timeout values + despite them being valid. */ + if (__glibc_unlikely ((abstime != NULL) && (abstime->tv_sec < 0))) + return ETIMEDOUT; + int err = lll_futex_timed_wait_bitset64 (futex_word, expected, abstime, + FUTEX_CLOCK_REALTIME, private); + switch (err) + { + case 0: + case -EAGAIN: + case -EINTR: + case -ETIMEDOUT: + return -err; + + case -EFAULT: /* Must have been caused by a glibc or application bug. */ + case -EINVAL: /* Either due to wrong alignment or due to the timeout not + being normalized. Must have been caused by a glibc or + application bug. */ + case -ENOSYS: /* Must have been caused by a glibc bug. */ + /* No other errors are documented at this time. */ + default: + futex_fatal_error (); + } +} + /* See sysdeps/nptl/futex-internal.h for details. */ static __always_inline int futex_abstimed_wait_cancelable (unsigned int *futex_word, @@ -224,6 +311,42 @@ futex_abstimed_wait_cancelable (unsigned int *futex_word, } } +/* 64-bit time version */ + +static __always_inline int +futex_abstimed_wait_cancelable64 (unsigned int *futex_word, + unsigned int expected, + const struct __timespec64 *abstime, + int private) +{ + /* Work around the fact that the kernel rejects negative timeout values + despite them being valid. */ + if (__glibc_unlikely ((abstime != NULL) && (abstime->tv_sec < 0))) + return ETIMEDOUT; + int oldtype; + oldtype = __pthread_enable_asynccancel (); + int err = lll_futex_timed_wait_bitset64 (futex_word, expected, abstime, + FUTEX_CLOCK_REALTIME, private); + __pthread_disable_asynccancel (oldtype); + switch (err) + { + case 0: + case -EAGAIN: + case -EINTR: + case -ETIMEDOUT: + return -err; + + case -EFAULT: /* Must have been caused by a glibc or application bug. */ + case -EINVAL: /* Either due to wrong alignment or due to the timeout not + being normalized. Must have been caused by a glibc or + application bug. */ + case -ENOSYS: /* Must have been caused by a glibc bug. */ + /* No other errors are documented at this time. */ + default: + futex_fatal_error (); + } +} + /* See sysdeps/nptl/futex-internal.h for details. */ static __always_inline void futex_wake (unsigned int *futex_word, int processes_to_wake, int private) diff --git a/sysdeps/unix/sysv/linux/lowlevellock-futex.h b/sysdeps/unix/sysv/linux/lowlevellock-futex.h index fc834ed16e..02fc2a51cd 100644 --- a/sysdeps/unix/sysv/linux/lowlevellock-futex.h +++ b/sysdeps/unix/sysv/linux/lowlevellock-futex.h @@ -82,6 +82,16 @@ __lll_private_flag (FUTEX_WAIT, private), \ val, timeout) +#define lll_futex_timed_wait64(futexp, val, timeout, private) \ + ({ \ + struct timespec ts; \ + ts.tv_sec = timeout->tv_sec; \ + ts.tv_nsec = timeout->tv_nsec; \ + lll_futex_syscall (4, futexp, \ + __lll_private_flag (FUTEX_WAIT, private), \ + val, &ts); \ + }) + #define lll_futex_timed_wait_bitset(futexp, val, timeout, clockbit, private) \ lll_futex_syscall (6, futexp, \ __lll_private_flag (FUTEX_WAIT_BITSET | (clockbit), \ @@ -89,6 +99,18 @@ val, timeout, NULL /* Unused. */, \ FUTEX_BITSET_MATCH_ANY) +#define lll_futex_timed_wait_bitset64(futexp, val, timeout, clockbit, private) \ + ({ \ + struct timespec ts; \ + ts.tv_sec = timeout->tv_sec; \ + ts.tv_nsec = timeout->tv_nsec; \ + lll_futex_syscall (6, futexp, \ + __lll_private_flag (FUTEX_WAIT_BITSET | (clockbit), \ + private), \ + val, &ts, NULL /* Unused. */, \ + FUTEX_BITSET_MATCH_ANY); \ + }) + #define lll_futex_wake(futexp, nr, private) \ lll_futex_syscall (4, futexp, \ __lll_private_flag (FUTEX_WAKE, private), nr, 0) diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist index 09e8447b06..228d45ca10 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist @@ -227,6 +227,9 @@ GLIBC_2.28 tss_create F GLIBC_2.28 tss_delete F GLIBC_2.28 tss_get F GLIBC_2.28 tss_set F +GLIBC_2.29 __pthread_cond_timedwait64 F +GLIBC_2.29 __pthread_mutex_timedlock64 F +GLIBC_2.29 __sem_timedwait64 F GLIBC_2.3.2 pthread_cond_broadcast F GLIBC_2.3.2 pthread_cond_destroy F GLIBC_2.3.2 pthread_cond_init F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/librt.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/librt.abilist index 7027d8ac78..d384de8776 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/librt.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/librt.abilist @@ -27,6 +27,7 @@ GLIBC_2.2 timer_delete F GLIBC_2.2 timer_getoverrun F GLIBC_2.2 timer_gettime F GLIBC_2.2 timer_settime F +GLIBC_2.29 __aio_suspend64 F GLIBC_2.29 __mq_timedreceive64 F GLIBC_2.29 __mq_timedsend_time64 F GLIBC_2.29 __timer_gettime64 F |