Skip to content
This repository was archived by the owner on Nov 8, 2023. It is now read-only.

Commit 09ecb00

Browse files
Tom CherryGerrit Code Review
authored andcommitted
Merge "Fix pthread_cond_clockwait() when cond is initialized with CLOCK_MONOTONIC"
2 parents 59cc0b3 + 800c1a9 commit 09ecb00

File tree

2 files changed

+31
-7
lines changed

2 files changed

+31
-7
lines changed

libc/bionic/pthread_cond.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ int pthread_cond_clockwait(pthread_cond_t* cond_interface, pthread_mutex_t* mute
221221
case CLOCK_MONOTONIC:
222222
return pthread_cond_timedwait_monotonic_np(cond_interface, mutex, abs_timeout);
223223
case CLOCK_REALTIME:
224-
return pthread_cond_timedwait(cond_interface, mutex, abs_timeout);
224+
return __pthread_cond_timedwait(__get_internal_cond(cond_interface), mutex, true, abs_timeout);
225225
default:
226226
return EINVAL;
227227
}

tests/pthread_test.cpp

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1624,14 +1624,27 @@ TEST_F(pthread_CondWakeupTest, signal_clockwait_realtime_realtime) {
16241624
#endif // __BIONIC__
16251625
}
16261626

1627-
static void pthread_cond_timedwait_timeout_helper(clockid_t clock,
1627+
static void pthread_cond_timedwait_timeout_helper(bool init_monotonic, clockid_t clock,
16281628
int (*wait_function)(pthread_cond_t* __cond,
16291629
pthread_mutex_t* __mutex,
16301630
const timespec* __timeout)) {
16311631
pthread_mutex_t mutex;
16321632
ASSERT_EQ(0, pthread_mutex_init(&mutex, nullptr));
16331633
pthread_cond_t cond;
1634-
ASSERT_EQ(0, pthread_cond_init(&cond, nullptr));
1634+
1635+
if (init_monotonic) {
1636+
pthread_condattr_t attr;
1637+
pthread_condattr_init(&attr);
1638+
1639+
ASSERT_EQ(0, pthread_condattr_setclock(&attr, CLOCK_MONOTONIC));
1640+
clockid_t clock;
1641+
ASSERT_EQ(0, pthread_condattr_getclock(&attr, &clock));
1642+
ASSERT_EQ(CLOCK_MONOTONIC, clock);
1643+
1644+
ASSERT_EQ(0, pthread_cond_init(&cond, &attr));
1645+
} else {
1646+
ASSERT_EQ(0, pthread_cond_init(&cond, nullptr));
1647+
}
16351648
ASSERT_EQ(0, pthread_mutex_lock(&mutex));
16361649

16371650
timespec ts;
@@ -1648,12 +1661,13 @@ static void pthread_cond_timedwait_timeout_helper(clockid_t clock,
16481661
}
16491662

16501663
TEST(pthread, pthread_cond_timedwait_timeout) {
1651-
pthread_cond_timedwait_timeout_helper(CLOCK_REALTIME, pthread_cond_timedwait);
1664+
pthread_cond_timedwait_timeout_helper(false, CLOCK_REALTIME, pthread_cond_timedwait);
16521665
}
16531666

16541667
TEST(pthread, pthread_cond_timedwait_monotonic_np_timeout) {
16551668
#if defined(__BIONIC__)
1656-
pthread_cond_timedwait_timeout_helper(CLOCK_MONOTONIC, pthread_cond_timedwait_monotonic_np);
1669+
pthread_cond_timedwait_timeout_helper(false, CLOCK_MONOTONIC, pthread_cond_timedwait_monotonic_np);
1670+
pthread_cond_timedwait_timeout_helper(true, CLOCK_MONOTONIC, pthread_cond_timedwait_monotonic_np);
16571671
#else // __BIONIC__
16581672
GTEST_SKIP() << "pthread_cond_timedwait_monotonic_np not available";
16591673
#endif // __BIONIC__
@@ -1662,12 +1676,22 @@ TEST(pthread, pthread_cond_timedwait_monotonic_np_timeout) {
16621676
TEST(pthread, pthread_cond_clockwait_timeout) {
16631677
#if defined(__BIONIC__)
16641678
pthread_cond_timedwait_timeout_helper(
1665-
CLOCK_MONOTONIC,
1679+
false, CLOCK_MONOTONIC,
16661680
[](pthread_cond_t* __cond, pthread_mutex_t* __mutex, const timespec* __timeout) {
16671681
return pthread_cond_clockwait(__cond, __mutex, CLOCK_MONOTONIC, __timeout);
16681682
});
16691683
pthread_cond_timedwait_timeout_helper(
1670-
CLOCK_REALTIME,
1684+
true, CLOCK_MONOTONIC,
1685+
[](pthread_cond_t* __cond, pthread_mutex_t* __mutex, const timespec* __timeout) {
1686+
return pthread_cond_clockwait(__cond, __mutex, CLOCK_MONOTONIC, __timeout);
1687+
});
1688+
pthread_cond_timedwait_timeout_helper(
1689+
false, CLOCK_REALTIME,
1690+
[](pthread_cond_t* __cond, pthread_mutex_t* __mutex, const timespec* __timeout) {
1691+
return pthread_cond_clockwait(__cond, __mutex, CLOCK_REALTIME, __timeout);
1692+
});
1693+
pthread_cond_timedwait_timeout_helper(
1694+
true, CLOCK_REALTIME,
16711695
[](pthread_cond_t* __cond, pthread_mutex_t* __mutex, const timespec* __timeout) {
16721696
return pthread_cond_clockwait(__cond, __mutex, CLOCK_REALTIME, __timeout);
16731697
});

0 commit comments

Comments
 (0)