summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--NEWS2
-rw-r--r--nptl/sem_waitcommon.c15
3 files changed, 25 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 2df497fb29..d4493230cc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2015-03-18 Joseph Myers <joseph@codesourcery.com>
+
+ [BZ #18138]
+ * nptl/sem_waitcommon.c: Include <kernel-features.h>.
+ (futex_abstimed_wait)
+ [__ASSUME_FUTEX_CLOCK_REALTIME && lll_futex_timed_wait_bitset]:
+ Use lll_futex_timed_wait_bitset with FUTEX_CLOCK_REALTIME instead
+ of lll_futex_timed_wait.
+
2015-03-18 Brad Hubbard <bhubbard@redhat.com>
[BZ #17542]
diff --git a/NEWS b/NEWS
index 54c9b90fe4..4c18bf41a7 100644
--- a/NEWS
+++ b/NEWS
@@ -15,7 +15,7 @@ Version 2.22
17932, 17944, 17949, 17964, 17965, 17967, 17969, 17978, 17987, 17991,
17996, 17998, 17999, 18019, 18020, 18029, 18030, 18032, 18036, 18038,
18039, 18042, 18043, 18046, 18047, 18068, 18080, 18093, 18104, 18110,
- 18111, 18128.
+ 18111, 18128, 18138.
* Character encoding and ctype tables were updated to Unicode 7.0.0, using
new generator scripts contributed by Pravin Satpute and Mike FABIAN (Red
diff --git a/nptl/sem_waitcommon.c b/nptl/sem_waitcommon.c
index 311e511195..772425d33e 100644
--- a/nptl/sem_waitcommon.c
+++ b/nptl/sem_waitcommon.c
@@ -17,6 +17,7 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
+#include <kernel-features.h>
#include <errno.h>
#include <sysdep.h>
#include <lowlevellock.h>
@@ -45,6 +46,13 @@ futex_abstimed_wait (unsigned int* futex, unsigned int expected,
}
else
{
+#if (defined __ASSUME_FUTEX_CLOCK_REALTIME \
+ && defined lll_futex_timed_wait_bitset)
+ /* The Linux kernel returns EINVAL for this, but in userspace
+ such a value is valid. */
+ if (abstime->tv_sec < 0)
+ return ETIMEDOUT;
+#else
struct timeval tv;
struct timespec rt;
int sec, nsec;
@@ -68,9 +76,16 @@ futex_abstimed_wait (unsigned int* futex, unsigned int expected,
/* Do wait. */
rt.tv_sec = sec;
rt.tv_nsec = nsec;
+#endif
if (cancel)
oldtype = __pthread_enable_asynccancel ();
+#if (defined __ASSUME_FUTEX_CLOCK_REALTIME \
+ && defined lll_futex_timed_wait_bitset)
+ err = lll_futex_timed_wait_bitset (futex, expected, abstime,
+ FUTEX_CLOCK_REALTIME, private);
+#else
err = lll_futex_timed_wait (futex, expected, &rt, private);
+#endif
if (cancel)
__pthread_disable_asynccancel (oldtype);
}