diff options
author | Victor Stinner <vstinner@python.org> | 2022-06-17 14:11:13 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-06-17 14:11:13 (GMT) |
commit | e444752fabb691593af9e2f767419bb5fd6ba507 (patch) | |
tree | 137c1bee2d8875ebf318f49de87a8812ac3e2dcf | |
parent | 17357108732c731d6ed4f2bd123ee6ba1ff6891b (diff) | |
download | cpython-e444752fabb691593af9e2f767419bb5fd6ba507.zip cpython-e444752fabb691593af9e2f767419bb5fd6ba507.tar.gz cpython-e444752fabb691593af9e2f767419bb5fd6ba507.tar.bz2 |
gh-74953: Add _PyTime_FromMicrosecondsClamp() function (#93942)
-rw-r--r-- | Include/cpython/pytime.h | 4 | ||||
-rw-r--r-- | Python/pytime.c | 8 | ||||
-rw-r--r-- | Python/thread_pthread.h | 25 |
3 files changed, 21 insertions, 16 deletions
diff --git a/Include/cpython/pytime.h b/Include/cpython/pytime.h index 23d4f16..e64f3b1 100644 --- a/Include/cpython/pytime.h +++ b/Include/cpython/pytime.h @@ -130,6 +130,10 @@ PyAPI_FUNC(_PyTime_t) _PyTime_FromSeconds(int seconds); /* Create a timestamp from a number of nanoseconds. */ PyAPI_FUNC(_PyTime_t) _PyTime_FromNanoseconds(_PyTime_t ns); +/* Create a timestamp from a number of microseconds. + * Clamp to [_PyTime_MIN; _PyTime_MAX] on overflow. */ +PyAPI_FUNC(_PyTime_t) _PyTime_FromMicrosecondsClamp(_PyTime_t us); + /* Create a timestamp from nanoseconds (Python int). */ PyAPI_FUNC(int) _PyTime_FromNanosecondsObject(_PyTime_t *t, PyObject *obj); diff --git a/Python/pytime.c b/Python/pytime.c index f49a25b..01c07da 100644 --- a/Python/pytime.c +++ b/Python/pytime.c @@ -406,6 +406,14 @@ _PyTime_FromNanoseconds(_PyTime_t ns) } +_PyTime_t +_PyTime_FromMicrosecondsClamp(_PyTime_t us) +{ + _PyTime_t ns = _PyTime_Mul(us, US_TO_NS); + return pytime_from_nanoseconds(ns); +} + + int _PyTime_FromNanosecondsObject(_PyTime_t *tp, PyObject *obj) { diff --git a/Python/thread_pthread.h b/Python/thread_pthread.h index 1b2c28d..195b277 100644 --- a/Python/thread_pthread.h +++ b/Python/thread_pthread.h @@ -438,22 +438,15 @@ PyThread_acquire_lock_timed(PyThread_type_lock lock, PY_TIMEOUT_T microseconds, _PyTime_t timeout; // relative timeout if (microseconds >= 0) { - _PyTime_t ns; - if (microseconds <= _PyTime_MAX / 1000) { - ns = microseconds * 1000; - } - else { - // bpo-41710: PyThread_acquire_lock_timed() cannot report timeout - // overflow to the caller, so clamp the timeout to - // [_PyTime_MIN, _PyTime_MAX]. - // - // _PyTime_MAX nanoseconds is around 292.3 years. - // - // _thread.Lock.acquire() and _thread.RLock.acquire() raise an - // OverflowError if microseconds is greater than PY_TIMEOUT_MAX. - ns = _PyTime_MAX; - } - timeout = _PyTime_FromNanoseconds(ns); + // bpo-41710: PyThread_acquire_lock_timed() cannot report timeout + // overflow to the caller, so clamp the timeout to + // [_PyTime_MIN, _PyTime_MAX]. + // + // _PyTime_MAX nanoseconds is around 292.3 years. + // + // _thread.Lock.acquire() and _thread.RLock.acquire() raise an + // OverflowError if microseconds is greater than PY_TIMEOUT_MAX. + timeout = _PyTime_FromMicrosecondsClamp(microseconds); } else { timeout = _PyTime_FromNanoseconds(-1); |