Skip to content

Commit 4685090

Browse files
b08902132Eric977
authored andcommitted
fix wrong function parameter
1 parent bdeaaa2 commit 4685090

File tree

2 files changed

+45
-17
lines changed

2 files changed

+45
-17
lines changed

libc/docs/dev/undefined_behavior.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,3 +93,8 @@ direction in this case.
9393
Non-const Constant Return Values
9494
--------------------------------
9595
Some libc functions, like ``dlerror()``, return ``char *`` instead of ``const char *`` and then tell the caller they promise not to to modify this value. Any modification of this value is undefined behavior.
96+
97+
Unrecognized ``clockid_t`` values for ``pthread_rwlock_clock*`` APIs
98+
----------------------------------------------------------------------
99+
POSIX.1-2024 only demands support for ``CLOCK_REALTIME`` and ``CLOCK_MONOTONIC``. Currently,
100+
as in LLVM libc, if other clock ids are used, they will be treated as monotonic clocks.

libc/test/integration/src/pthread/pthread_rwlock_test.cpp

Lines changed: 40 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,12 @@ static void nullptr_test() {
114114
ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlock_wrlock(nullptr), EINVAL);
115115
ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlock_timedrdlock(nullptr, &ts), EINVAL);
116116
ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlock_timedwrlock(nullptr, &ts), EINVAL);
117-
ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlock_clockrdlock(nullptr, &ts), EINVAL);
118-
ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlock_clockwrlock(nullptr, &ts), EINVAL);
117+
ASSERT_EQ(
118+
LIBC_NAMESPACE::pthread_rwlock_clockrdlock(nullptr, CLOCK_MONOTONIC, &ts),
119+
EINVAL);
120+
ASSERT_EQ(
121+
LIBC_NAMESPACE::pthread_rwlock_clockwrlock(nullptr, CLOCK_MONOTONIC, &ts),
122+
EINVAL);
119123
ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlock_tryrdlock(nullptr), EINVAL);
120124
ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlock_trywrlock(nullptr), EINVAL);
121125
ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlock_unlock(nullptr), EINVAL);
@@ -163,26 +167,40 @@ static void unusual_timespec_test() {
163167
timespec ts = {0, -1};
164168
ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlock_timedrdlock(&rwlock, &ts), EINVAL);
165169
ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlock_timedwrlock(&rwlock, &ts), EINVAL);
166-
ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlock_clockrdlock(&rwlock, &ts), EINVAL);
167-
ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlock_clockwrlock(&rwlock, &ts), EINVAL);
170+
ASSERT_EQ(
171+
LIBC_NAMESPACE::pthread_rwlock_clockrdlock(&rwlock, CLOCK_MONOTONIC, &ts),
172+
EINVAL);
173+
ASSERT_EQ(
174+
LIBC_NAMESPACE::pthread_rwlock_clockwrlock(&rwlock, CLOCK_MONOTONIC, &ts),
175+
EINVAL);
168176
ts.tv_nsec = 1'000'000'000;
169177
ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlock_timedrdlock(&rwlock, &ts), EINVAL);
170-
ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlock_clockrdlock(&rwlock, &ts), EINVAL);
171-
ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlock_clockwrlock(&rwlock, &ts), EINVAL);
178+
ASSERT_EQ(
179+
LIBC_NAMESPACE::pthread_rwlock_clockrdlock(&rwlock, CLOCK_MONOTONIC, &ts),
180+
EINVAL);
181+
ASSERT_EQ(
182+
LIBC_NAMESPACE::pthread_rwlock_clockwrlock(&rwlock, CLOCK_MONOTONIC, &ts),
183+
EINVAL);
172184
ts.tv_nsec += 1;
173185
ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlock_timedwrlock(&rwlock, &ts), EINVAL);
174-
ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlock_clockrdlock(&rwlock, &ts), EINVAL);
175-
ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlock_clockwrlock(&rwlock, &ts), EINVAL);
186+
ASSERT_EQ(
187+
LIBC_NAMESPACE::pthread_rwlock_clockrdlock(&rwlock, CLOCK_MONOTONIC, &ts),
188+
EINVAL);
189+
ASSERT_EQ(
190+
LIBC_NAMESPACE::pthread_rwlock_clockwrlock(&rwlock, CLOCK_MONOTONIC, &ts),
191+
EINVAL);
176192
ts.tv_nsec = 0;
177193
ts.tv_sec = -1;
178194
ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlock_timedrdlock(&rwlock, &ts),
179195
ETIMEDOUT);
180196
ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlock_timedwrlock(&rwlock, &ts),
181197
ETIMEDOUT);
182-
ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlock_clockrdlock(&rwlock, &ts),
183-
ETIMEDOUT);
184-
ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlock_clockwrlock(&rwlock, &ts),
185-
ETIMEDOUT);
198+
ASSERT_EQ(
199+
LIBC_NAMESPACE::pthread_rwlock_clockrdlock(&rwlock, CLOCK_MONOTONIC, &ts),
200+
ETIMEDOUT);
201+
ASSERT_EQ(
202+
LIBC_NAMESPACE::pthread_rwlock_clockwrlock(&rwlock, CLOCK_MONOTONIC, &ts),
203+
ETIMEDOUT);
186204
}
187205

188206
static void timedlock_with_deadlock_test() {
@@ -198,9 +216,12 @@ static void timedlock_with_deadlock_test() {
198216
ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlock_timedwrlock(&rwlock, &ts),
199217
ETIMEDOUT);
200218
ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlock_timedrdlock(&rwlock, &ts), 0);
201-
ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlock_clockwrlock(&rwlock, &ts),
202-
ETIMEDOUT);
203-
ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlock_clockrdlock(&rwlock, &ts), 0);
219+
ASSERT_EQ(
220+
LIBC_NAMESPACE::pthread_rwlock_clockwrlock(&rwlock, CLOCK_MONOTONIC, &ts),
221+
ETIMEDOUT);
222+
ASSERT_EQ(
223+
LIBC_NAMESPACE::pthread_rwlock_clockrdlock(&rwlock, CLOCK_MONOTONIC, &ts),
224+
0);
204225
ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlock_unlock(&rwlock), 0);
205226
ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlock_unlock(&rwlock), 0);
206227
// notice that ts is already expired, but the following should still succeed.
@@ -379,15 +400,17 @@ static void randomized_thread_operation(SharedData *data, ThreadGuard &guard) {
379400
}
380401
case Operation::CLOCK_READ: {
381402
timespec ts = get_ts();
382-
if (LIBC_NAMESPACE::pthread_rwlock_clockrdlock(&data->lock, &ts) == 0) {
403+
if (LIBC_NAMESPACE::pthread_rwlock_clockrdlock(&data->lock, CLOCK_MONOTONIC,
404+
&ts) == 0) {
383405
read_ops();
384406
LIBC_NAMESPACE::pthread_rwlock_unlock(&data->lock);
385407
}
386408
break;
387409
}
388410
case Operation::CLOCK_WRITE: {
389411
timespec ts = get_ts();
390-
if (LIBC_NAMESPACE::pthread_rwlock_clockwrlock(&data->lock, &ts) == 0) {
412+
if (LIBC_NAMESPACE::pthread_rwlock_clockwrlock(&data->lock, CLOCK_MONOTONIC,
413+
&ts) == 0) {
391414
write_ops();
392415
LIBC_NAMESPACE::pthread_rwlock_unlock(&data->lock);
393416
}

0 commit comments

Comments
 (0)