summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2022-06-21 13:45:49 (GMT)
committerGitHub <noreply@github.com>2022-06-21 13:45:49 (GMT)
commitc7a79bb036b42f96b7379b95efa643ee27df2168 (patch)
tree868fc006fd833fde6f1b62f4f5fa60a06dd9bdb7 /Python
parent616fa3465d99a262dc8948ff5e00e47fe92eaaba (diff)
downloadcpython-c7a79bb036b42f96b7379b95efa643ee27df2168.zip
cpython-c7a79bb036b42f96b7379b95efa643ee27df2168.tar.gz
cpython-c7a79bb036b42f96b7379b95efa643ee27df2168.tar.bz2
gh-74953: _PyThread_cond_after() uses _PyTime_t (#94056)
pthread _PyThread_cond_after() implementation now uses the _PyTime_t type to handle properly overflow: clamp to the maximum value. Remove MICROSECONDS_TO_TIMESPEC() function.
Diffstat (limited to 'Python')
-rw-r--r--Python/condvar.h6
-rw-r--r--Python/thread_pthread.h39
2 files changed, 16 insertions, 29 deletions
diff --git a/Python/condvar.h b/Python/condvar.h
index e5df7ff..4ddc531 100644
--- a/Python/condvar.h
+++ b/Python/condvar.h
@@ -68,9 +68,9 @@ void _PyThread_cond_after(long long us, struct timespec *abs);
Py_LOCAL_INLINE(int)
PyCOND_TIMEDWAIT(PyCOND_T *cond, PyMUTEX_T *mut, long long us)
{
- struct timespec abs;
- _PyThread_cond_after(us, &abs);
- int ret = pthread_cond_timedwait(cond, mut, &abs);
+ struct timespec abs_timeout;
+ _PyThread_cond_after(us, &abs_timeout);
+ int ret = pthread_cond_timedwait(cond, mut, &abs_timeout);
if (ret == ETIMEDOUT) {
return 1;
}
diff --git a/Python/thread_pthread.h b/Python/thread_pthread.h
index a5719c3..c310d72 100644
--- a/Python/thread_pthread.h
+++ b/Python/thread_pthread.h
@@ -113,19 +113,6 @@
#endif
-#define MICROSECONDS_TO_TIMESPEC(microseconds, ts) \
-do { \
- struct timeval tv; \
- gettimeofday(&tv, NULL); \
- tv.tv_usec += microseconds % 1000000; \
- tv.tv_sec += microseconds / 1000000; \
- tv.tv_sec += tv.tv_usec / 1000000; \
- tv.tv_usec %= 1000000; \
- ts.tv_sec = tv.tv_sec; \
- ts.tv_nsec = tv.tv_usec * 1000; \
-} while(0)
-
-
/*
* pthread_cond support
*/
@@ -156,23 +143,23 @@ _PyThread_cond_init(PyCOND_T *cond)
return pthread_cond_init(cond, condattr_monotonic);
}
+
void
_PyThread_cond_after(long long us, struct timespec *abs)
{
+ _PyTime_t timeout = _PyTime_FromMicrosecondsClamp(us);
+ _PyTime_t t;
#ifdef CONDATTR_MONOTONIC
if (condattr_monotonic) {
- clock_gettime(CLOCK_MONOTONIC, abs);
- abs->tv_sec += us / 1000000;
- abs->tv_nsec += (us % 1000000) * 1000;
- abs->tv_sec += abs->tv_nsec / 1000000000;
- abs->tv_nsec %= 1000000000;
- return;
+ t = _PyTime_GetMonotonicClock();
}
+ else
#endif
-
- struct timespec ts;
- MICROSECONDS_TO_TIMESPEC(us, ts);
- *abs = ts;
+ {
+ t = _PyTime_GetSystemClock();
+ }
+ t = _PyTime_Add(t, timeout);
+ _PyTime_AsTimespec_clamp(t, abs);
}
@@ -639,9 +626,9 @@ PyThread_acquire_lock_timed(PyThread_type_lock lock, PY_TIMEOUT_T microseconds,
goto unlock;
}
- struct timespec abs;
+ struct timespec abs_timeout;
if (microseconds > 0) {
- _PyThread_cond_after(microseconds, &abs);
+ _PyThread_cond_after(microseconds, &abs_timeout);
}
// Continue trying until we get the lock
@@ -649,7 +636,7 @@ PyThread_acquire_lock_timed(PyThread_type_lock lock, PY_TIMEOUT_T microseconds,
while (1) {
if (microseconds > 0) {
status = pthread_cond_timedwait(&thelock->lock_released,
- &thelock->mut, &abs);
+ &thelock->mut, &abs_timeout);
if (status == 1) {
break;
}