mirror of
https://github.com/AdaCore/cpython.git
synced 2026-02-12 12:57:15 -08:00
bpo-31784: Implement PEP 564: add time.time_ns() (#3989)
Add new time functions: * time.clock_gettime_ns() * time.clock_settime_ns() * time.monotonic_ns() * time.perf_counter_ns() * time.process_time_ns() * time.time_ns() Add new _PyTime functions: * _PyTime_FromTimespec() * _PyTime_FromNanosecondsObject() * _PyTime_FromTimeval() Other changes: * Add also os.times() tests to test_os. * pytime_fromtimeval() and pytime_fromtimeval() now return _PyTime_MAX or _PyTime_MIN on overflow, rather than undefined behaviour * _PyTime_FromNanoseconds() parameter type changes from long long to _PyTime_t
This commit is contained in:
@@ -185,7 +185,7 @@ Functions
|
||||
.. versionadded:: 3.3
|
||||
|
||||
|
||||
.. function:: clock_gettime(clk_id)
|
||||
.. function:: clock_gettime(clk_id) -> float
|
||||
|
||||
Return the time of the specified clock *clk_id*. Refer to
|
||||
:ref:`time-clock-id-constants` for a list of accepted values for *clk_id*.
|
||||
@@ -195,7 +195,16 @@ Functions
|
||||
.. versionadded:: 3.3
|
||||
|
||||
|
||||
.. function:: clock_settime(clk_id, time)
|
||||
.. function:: clock_gettime_ns(clk_id) -> int
|
||||
|
||||
Similar to :func:`clock_gettime` but return time as nanoseconds.
|
||||
|
||||
Availability: Unix.
|
||||
|
||||
.. versionadded:: 3.7
|
||||
|
||||
|
||||
.. function:: clock_settime(clk_id, time: float)
|
||||
|
||||
Set the time of the specified clock *clk_id*. Currently,
|
||||
:data:`CLOCK_REALTIME` is the only accepted value for *clk_id*.
|
||||
@@ -205,6 +214,15 @@ Functions
|
||||
.. versionadded:: 3.3
|
||||
|
||||
|
||||
.. function:: clock_settime_ns(clk_id, time: int)
|
||||
|
||||
Similar to :func:`clock_settime` but set time with nanoseconds.
|
||||
|
||||
Availability: Unix.
|
||||
|
||||
.. versionadded:: 3.7
|
||||
|
||||
|
||||
.. function:: ctime([secs])
|
||||
|
||||
Convert a time expressed in seconds since the epoch to a string representing
|
||||
@@ -267,7 +285,7 @@ Functions
|
||||
The earliest date for which it can generate a time is platform-dependent.
|
||||
|
||||
|
||||
.. function:: monotonic()
|
||||
.. function:: monotonic() -> float
|
||||
|
||||
Return the value (in fractional seconds) of a monotonic clock, i.e. a clock
|
||||
that cannot go backwards. The clock is not affected by system clock updates.
|
||||
@@ -287,7 +305,13 @@ Functions
|
||||
The function is now always available.
|
||||
|
||||
|
||||
.. function:: perf_counter()
|
||||
.. function:: monotonic_ns() -> int
|
||||
|
||||
Similar to :func:`monotonic`, but return time as nanoseconds.
|
||||
|
||||
.. versionadded:: 3.7
|
||||
|
||||
.. function:: perf_counter() -> float
|
||||
|
||||
.. index::
|
||||
single: benchmarking
|
||||
@@ -300,8 +324,14 @@ Functions
|
||||
|
||||
.. versionadded:: 3.3
|
||||
|
||||
.. function:: perf_counter_ns() -> int
|
||||
|
||||
.. function:: process_time()
|
||||
Similar to :func:`perf_counter`, but return time as nanoseconds.
|
||||
|
||||
.. versionadded:: 3.7
|
||||
|
||||
|
||||
.. function:: process_time() -> float
|
||||
|
||||
.. index::
|
||||
single: CPU time
|
||||
@@ -316,6 +346,12 @@ Functions
|
||||
|
||||
.. versionadded:: 3.3
|
||||
|
||||
.. function:: process_time_ns() -> int
|
||||
|
||||
Similar to :func:`process_time` but return time as nanoseconds.
|
||||
|
||||
.. versionadded:: 3.7
|
||||
|
||||
.. function:: sleep(secs)
|
||||
|
||||
Suspend execution of the calling thread for the given number of seconds.
|
||||
@@ -541,7 +577,7 @@ Functions
|
||||
:class:`struct_time`, or having elements of the wrong type, a
|
||||
:exc:`TypeError` is raised.
|
||||
|
||||
.. function:: time()
|
||||
.. function:: time() -> float
|
||||
|
||||
Return the time in seconds since the epoch_ as a floating point
|
||||
number. The specific date of the epoch and the handling of
|
||||
@@ -567,6 +603,13 @@ Functions
|
||||
of the calendar date may be accessed as attributes.
|
||||
|
||||
|
||||
.. function:: time_ns() -> int
|
||||
|
||||
Similar to :func:`time` but returns time as an integer number of nanoseconds
|
||||
since the epoch_.
|
||||
|
||||
.. versionadded:: 3.7
|
||||
|
||||
.. function:: tzset()
|
||||
|
||||
Reset the time conversion rules used by the library routines. The environment
|
||||
|
||||
@@ -159,6 +159,32 @@ effort will be made to add such support.
|
||||
PEP written by Erik M. Bray; implementation by Masayuki Yamamoto.
|
||||
|
||||
|
||||
PEP 564: Add new time functions with nanosecond resolution
|
||||
----------------------------------------------------------
|
||||
|
||||
Add six new "nanosecond" variants of existing functions to the :mod:`time`
|
||||
module:
|
||||
|
||||
* :func:`time.clock_gettime_ns`
|
||||
* :func:`time.clock_settime_ns`
|
||||
* :func:`time.monotonic_ns`
|
||||
* :func:`time.perf_counter_ns`
|
||||
* :func:`time.process_time_ns`
|
||||
* :func:`time.time_ns`
|
||||
|
||||
While similar to the existing functions without the ``_ns`` suffix, they
|
||||
provide nanosecond resolution: they return a number of nanoseconds as a Python
|
||||
``int``.
|
||||
|
||||
The ``time.time_ns()`` resolution is 3 times better than the ``time.time()``
|
||||
resolution on Linux and Windows.
|
||||
|
||||
.. seealso::
|
||||
|
||||
:pep:`564` -- Add new time functions with nanosecond resolution
|
||||
PEP written and implemented by Victor Stinner
|
||||
|
||||
|
||||
Other Language Changes
|
||||
======================
|
||||
|
||||
@@ -313,6 +339,15 @@ separately. (Contributed by Barry Warsaw in :issue:`1198569`.)
|
||||
time
|
||||
----
|
||||
|
||||
The :pep:`564` added six new functions with nanosecond resolution:
|
||||
|
||||
* :func:`time.clock_gettime_ns`
|
||||
* :func:`time.clock_settime_ns`
|
||||
* :func:`time.monotonic_ns`
|
||||
* :func:`time.perf_counter_ns`
|
||||
* :func:`time.process_time_ns`
|
||||
* :func:`time.time_ns`
|
||||
|
||||
Add new clock identifiers:
|
||||
|
||||
* :data:`time.CLOCK_BOOTTIME` (Linux): Identical to
|
||||
|
||||
@@ -85,7 +85,11 @@ PyAPI_FUNC(_PyTime_t) _PyTime_FromSeconds(int seconds);
|
||||
((_PyTime_t)(seconds) * (1000 * 1000 * 1000))
|
||||
|
||||
/* Create a timestamp from a number of nanoseconds. */
|
||||
PyAPI_FUNC(_PyTime_t) _PyTime_FromNanoseconds(long long ns);
|
||||
PyAPI_FUNC(_PyTime_t) _PyTime_FromNanoseconds(_PyTime_t ns);
|
||||
|
||||
/* Create a timestamp from nanoseconds (Python int). */
|
||||
PyAPI_FUNC(int) _PyTime_FromNanosecondsObject(_PyTime_t *t,
|
||||
PyObject *obj);
|
||||
|
||||
/* Convert a number of seconds (Python float or int) to a timetamp.
|
||||
Raise an exception and return -1 on error, return 0 on success. */
|
||||
@@ -114,6 +118,10 @@ PyAPI_FUNC(_PyTime_t) _PyTime_AsMicroseconds(_PyTime_t t,
|
||||
object. */
|
||||
PyAPI_FUNC(PyObject *) _PyTime_AsNanosecondsObject(_PyTime_t t);
|
||||
|
||||
/* Create a timestamp from a timeval structure.
|
||||
Raise an exception and return -1 on overflow, return 0 on success. */
|
||||
PyAPI_FUNC(int) _PyTime_FromTimeval(_PyTime_t *tp, struct timeval *tv);
|
||||
|
||||
/* Convert a timestamp to a timeval structure (microsecond resolution).
|
||||
tv_usec is always positive.
|
||||
Raise an exception and return -1 if the conversion overflowed,
|
||||
@@ -140,12 +148,22 @@ PyAPI_FUNC(int) _PyTime_AsTimevalTime_t(
|
||||
_PyTime_round_t round);
|
||||
|
||||
#if defined(HAVE_CLOCK_GETTIME) || defined(HAVE_KQUEUE)
|
||||
/* Create a timestamp from a timespec structure.
|
||||
Raise an exception and return -1 on overflow, return 0 on success. */
|
||||
PyAPI_FUNC(int) _PyTime_FromTimespec(_PyTime_t *tp, struct timespec *ts);
|
||||
|
||||
/* Convert a timestamp to a timespec structure (nanosecond resolution).
|
||||
tv_nsec is always positive.
|
||||
Raise an exception and return -1 on error, return 0 on success. */
|
||||
PyAPI_FUNC(int) _PyTime_AsTimespec(_PyTime_t t, struct timespec *ts);
|
||||
#endif
|
||||
|
||||
/* Compute ticks * mul / div.
|
||||
The caller must ensure that ((div - 1) * mul) cannot overflow. */
|
||||
PyAPI_FUNC(_PyTime_t) _PyTime_MulDiv(_PyTime_t ticks,
|
||||
_PyTime_t mul,
|
||||
_PyTime_t div);
|
||||
|
||||
/* Get the current time from the system clock.
|
||||
|
||||
The function cannot fail. _PyTime_Init() ensures that the system clock
|
||||
|
||||
@@ -3549,6 +3549,23 @@ class TestPEP519(unittest.TestCase):
|
||||
self.assertRaises(ZeroDivisionError, self.fspath,
|
||||
_PathLike(ZeroDivisionError()))
|
||||
|
||||
|
||||
class TimesTests(unittest.TestCase):
|
||||
def test_times(self):
|
||||
times = os.times()
|
||||
self.assertIsInstance(times, os.times_result)
|
||||
|
||||
for field in ('user', 'system', 'children_user', 'children_system',
|
||||
'elapsed'):
|
||||
value = getattr(times, field)
|
||||
self.assertIsInstance(value, float)
|
||||
|
||||
if os.name == 'nt':
|
||||
self.assertEqual(times.children_user, 0)
|
||||
self.assertEqual(times.children_system, 0)
|
||||
self.assertEqual(times.elapsed, 0)
|
||||
|
||||
|
||||
# Only test if the C version is provided, otherwise TestPEP519 already tested
|
||||
# the pure Python implementation.
|
||||
if hasattr(os, "_fspath"):
|
||||
|
||||
@@ -64,6 +64,27 @@ class TimeTestCase(unittest.TestCase):
|
||||
self.assertFalse(info.monotonic)
|
||||
self.assertTrue(info.adjustable)
|
||||
|
||||
def test_time_ns_type(self):
|
||||
def check_ns(sec, ns):
|
||||
self.assertIsInstance(ns, int)
|
||||
|
||||
sec_ns = int(sec * 1e9)
|
||||
# tolerate a difference of 50 ms
|
||||
self.assertLess((sec_ns - ns), 50 ** 6, (sec, ns))
|
||||
|
||||
check_ns(time.time(),
|
||||
time.time_ns())
|
||||
check_ns(time.monotonic(),
|
||||
time.monotonic_ns())
|
||||
check_ns(time.perf_counter(),
|
||||
time.perf_counter_ns())
|
||||
check_ns(time.process_time(),
|
||||
time.process_time_ns())
|
||||
|
||||
if hasattr(time, 'clock_gettime'):
|
||||
check_ns(time.clock_gettime(time.CLOCK_REALTIME),
|
||||
time.clock_gettime_ns(time.CLOCK_REALTIME))
|
||||
|
||||
def test_clock(self):
|
||||
with self.assertWarns(DeprecationWarning):
|
||||
time.clock()
|
||||
@@ -76,7 +97,8 @@ class TimeTestCase(unittest.TestCase):
|
||||
@unittest.skipUnless(hasattr(time, 'clock_gettime'),
|
||||
'need time.clock_gettime()')
|
||||
def test_clock_realtime(self):
|
||||
time.clock_gettime(time.CLOCK_REALTIME)
|
||||
t = time.clock_gettime(time.CLOCK_REALTIME)
|
||||
self.assertIsInstance(t, float)
|
||||
|
||||
@unittest.skipUnless(hasattr(time, 'clock_gettime'),
|
||||
'need time.clock_gettime()')
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
Implement the :pep:`564`, add new 6 new functions with nanosecond resolution to
|
||||
the :mod:`time` module: :func:`~time.clock_gettime_ns`,
|
||||
:func:`~time.clock_settime_ns`, :func:`~time.monotonic_ns`,
|
||||
:func:`~time.perf_counter_ns`, :func:`~time.process_time_ns`,
|
||||
:func:`~time.time_ns`.
|
||||
@@ -3946,13 +3946,16 @@ test_pytime_fromsecondsobject(PyObject *self, PyObject *args)
|
||||
static PyObject *
|
||||
test_pytime_assecondsdouble(PyObject *self, PyObject *args)
|
||||
{
|
||||
long long ns;
|
||||
PyObject *obj;
|
||||
_PyTime_t ts;
|
||||
double d;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "L", &ns))
|
||||
if (!PyArg_ParseTuple(args, "O", &obj)) {
|
||||
return NULL;
|
||||
ts = _PyTime_FromNanoseconds(ns);
|
||||
}
|
||||
if (_PyTime_FromNanosecondsObject(&ts, obj) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
d = _PyTime_AsSecondsDouble(ts);
|
||||
return PyFloat_FromDouble(d);
|
||||
}
|
||||
@@ -3960,23 +3963,28 @@ test_pytime_assecondsdouble(PyObject *self, PyObject *args)
|
||||
static PyObject *
|
||||
test_PyTime_AsTimeval(PyObject *self, PyObject *args)
|
||||
{
|
||||
long long ns;
|
||||
PyObject *obj;
|
||||
int round;
|
||||
_PyTime_t t;
|
||||
struct timeval tv;
|
||||
PyObject *seconds;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "Li", &ns, &round))
|
||||
if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
|
||||
return NULL;
|
||||
if (check_time_rounding(round) < 0)
|
||||
if (check_time_rounding(round) < 0) {
|
||||
return NULL;
|
||||
t = _PyTime_FromNanoseconds(ns);
|
||||
if (_PyTime_AsTimeval(t, &tv, round) < 0)
|
||||
}
|
||||
if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
if (_PyTime_AsTimeval(t, &tv, round) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
seconds = PyLong_FromLongLong(tv.tv_sec);
|
||||
if (seconds == NULL)
|
||||
if (seconds == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
return Py_BuildValue("Nl", seconds, tv.tv_usec);
|
||||
}
|
||||
|
||||
@@ -3984,15 +3992,19 @@ test_PyTime_AsTimeval(PyObject *self, PyObject *args)
|
||||
static PyObject *
|
||||
test_PyTime_AsTimespec(PyObject *self, PyObject *args)
|
||||
{
|
||||
long long ns;
|
||||
PyObject *obj;
|
||||
_PyTime_t t;
|
||||
struct timespec ts;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "L", &ns))
|
||||
if (!PyArg_ParseTuple(args, "O", &obj)) {
|
||||
return NULL;
|
||||
t = _PyTime_FromNanoseconds(ns);
|
||||
if (_PyTime_AsTimespec(t, &ts) == -1)
|
||||
}
|
||||
if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
if (_PyTime_AsTimespec(t, &ts) == -1) {
|
||||
return NULL;
|
||||
}
|
||||
return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
|
||||
}
|
||||
#endif
|
||||
@@ -4000,15 +4012,19 @@ test_PyTime_AsTimespec(PyObject *self, PyObject *args)
|
||||
static PyObject *
|
||||
test_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
|
||||
{
|
||||
long long ns;
|
||||
PyObject *obj;
|
||||
int round;
|
||||
_PyTime_t t, ms;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "Li", &ns, &round))
|
||||
if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
|
||||
return NULL;
|
||||
if (check_time_rounding(round) < 0)
|
||||
}
|
||||
if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
|
||||
return NULL;
|
||||
t = _PyTime_FromNanoseconds(ns);
|
||||
}
|
||||
if (check_time_rounding(round) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
ms = _PyTime_AsMilliseconds(t, round);
|
||||
/* This conversion rely on the fact that _PyTime_t is a number of
|
||||
nanoseconds */
|
||||
@@ -4018,15 +4034,18 @@ test_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
|
||||
static PyObject *
|
||||
test_PyTime_AsMicroseconds(PyObject *self, PyObject *args)
|
||||
{
|
||||
long long ns;
|
||||
PyObject *obj;
|
||||
int round;
|
||||
_PyTime_t t, ms;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "Li", &ns, &round))
|
||||
if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
|
||||
return NULL;
|
||||
if (check_time_rounding(round) < 0)
|
||||
if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
|
||||
return NULL;
|
||||
t = _PyTime_FromNanoseconds(ns);
|
||||
}
|
||||
if (check_time_rounding(round) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
ms = _PyTime_AsMicroseconds(t, round);
|
||||
/* This conversion rely on the fact that _PyTime_t is a number of
|
||||
nanoseconds */
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
107
Python/pytime.c
107
Python/pytime.c
@@ -43,8 +43,7 @@ _PyTime_overflow(void)
|
||||
}
|
||||
|
||||
|
||||
#if defined(MS_WINDOWS) || defined(__APPLE__)
|
||||
Py_LOCAL_INLINE(_PyTime_t)
|
||||
_PyTime_t
|
||||
_PyTime_MulDiv(_PyTime_t ticks, _PyTime_t mul, _PyTime_t div)
|
||||
{
|
||||
_PyTime_t intpart, remaining;
|
||||
@@ -60,7 +59,6 @@ _PyTime_MulDiv(_PyTime_t ticks, _PyTime_t mul, _PyTime_t div)
|
||||
remaining /= div;
|
||||
return intpart * mul + remaining;
|
||||
}
|
||||
#endif /* defined(MS_WINDOWS) || defined(__APPLE__) */
|
||||
|
||||
|
||||
time_t
|
||||
@@ -254,19 +252,44 @@ _PyTime_FromSeconds(int seconds)
|
||||
}
|
||||
|
||||
_PyTime_t
|
||||
_PyTime_FromNanoseconds(long long ns)
|
||||
_PyTime_FromNanoseconds(_PyTime_t ns)
|
||||
{
|
||||
/* _PyTime_t already uses nanosecond resolution, no conversion needed */
|
||||
return ns;
|
||||
}
|
||||
|
||||
int
|
||||
_PyTime_FromNanosecondsObject(_PyTime_t *tp, PyObject *obj)
|
||||
{
|
||||
long long nsec;
|
||||
_PyTime_t t;
|
||||
Py_BUILD_ASSERT(sizeof(long long) <= sizeof(_PyTime_t));
|
||||
t = Py_SAFE_DOWNCAST(ns, long long, _PyTime_t);
|
||||
return t;
|
||||
|
||||
if (!PyLong_Check(obj)) {
|
||||
PyErr_Format(PyExc_TypeError, "expect int, got %s",
|
||||
Py_TYPE(obj)->tp_name);
|
||||
return -1;
|
||||
}
|
||||
|
||||
Py_BUILD_ASSERT(sizeof(long long) == sizeof(_PyTime_t));
|
||||
nsec = PyLong_AsLongLong(obj);
|
||||
if (nsec == -1 && PyErr_Occurred()) {
|
||||
if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
|
||||
_PyTime_overflow();
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* _PyTime_t already uses nanosecond resolution, no conversion needed */
|
||||
t = (_PyTime_t)nsec;
|
||||
*tp = t;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef HAVE_CLOCK_GETTIME
|
||||
static int
|
||||
_PyTime_FromTimespec(_PyTime_t *tp, struct timespec *ts, int raise)
|
||||
pytime_fromtimespec(_PyTime_t *tp, struct timespec *ts, int raise)
|
||||
{
|
||||
_PyTime_t t;
|
||||
_PyTime_t t, nsec;
|
||||
int res = 0;
|
||||
|
||||
Py_BUILD_ASSERT(sizeof(ts->tv_sec) <= sizeof(_PyTime_t));
|
||||
@@ -277,19 +300,42 @@ _PyTime_FromTimespec(_PyTime_t *tp, struct timespec *ts, int raise)
|
||||
_PyTime_overflow();
|
||||
}
|
||||
res = -1;
|
||||
t = (t > 0) ? _PyTime_MAX : _PyTime_MIN;
|
||||
}
|
||||
else {
|
||||
t = t * SEC_TO_NS;
|
||||
}
|
||||
t = t * SEC_TO_NS;
|
||||
|
||||
t += ts->tv_nsec;
|
||||
nsec = ts->tv_nsec;
|
||||
/* The following test is written for positive only nsec */
|
||||
assert(nsec >= 0);
|
||||
if (t > _PyTime_MAX - nsec) {
|
||||
if (raise) {
|
||||
_PyTime_overflow();
|
||||
}
|
||||
res = -1;
|
||||
t = _PyTime_MAX;
|
||||
}
|
||||
else {
|
||||
t += nsec;
|
||||
}
|
||||
|
||||
*tp = t;
|
||||
return res;
|
||||
}
|
||||
#elif !defined(MS_WINDOWS)
|
||||
static int
|
||||
_PyTime_FromTimeval(_PyTime_t *tp, struct timeval *tv, int raise)
|
||||
|
||||
int
|
||||
_PyTime_FromTimespec(_PyTime_t *tp, struct timespec *ts)
|
||||
{
|
||||
_PyTime_t t;
|
||||
return pytime_fromtimespec(tp, ts, 1);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !defined(MS_WINDOWS)
|
||||
static int
|
||||
pytime_fromtimeval(_PyTime_t *tp, struct timeval *tv, int raise)
|
||||
{
|
||||
_PyTime_t t, usec;
|
||||
int res = 0;
|
||||
|
||||
Py_BUILD_ASSERT(sizeof(tv->tv_sec) <= sizeof(_PyTime_t));
|
||||
@@ -300,14 +346,35 @@ _PyTime_FromTimeval(_PyTime_t *tp, struct timeval *tv, int raise)
|
||||
_PyTime_overflow();
|
||||
}
|
||||
res = -1;
|
||||
t = (t > 0) ? _PyTime_MAX : _PyTime_MIN;
|
||||
}
|
||||
else {
|
||||
t = t * SEC_TO_NS;
|
||||
}
|
||||
t = t * SEC_TO_NS;
|
||||
|
||||
t += (_PyTime_t)tv->tv_usec * US_TO_NS;
|
||||
usec = (_PyTime_t)tv->tv_usec * US_TO_NS;
|
||||
/* The following test is written for positive only usec */
|
||||
assert(usec >= 0);
|
||||
if (t > _PyTime_MAX - usec) {
|
||||
if (raise) {
|
||||
_PyTime_overflow();
|
||||
}
|
||||
res = -1;
|
||||
t = _PyTime_MAX;
|
||||
}
|
||||
else {
|
||||
t += usec;
|
||||
}
|
||||
|
||||
*tp = t;
|
||||
return res;
|
||||
}
|
||||
|
||||
int
|
||||
_PyTime_FromTimeval(_PyTime_t *tp, struct timeval *tv)
|
||||
{
|
||||
return pytime_fromtimeval(tp, tv, 1);
|
||||
}
|
||||
#endif
|
||||
|
||||
static int
|
||||
@@ -632,7 +699,7 @@ pygettimeofday(_PyTime_t *tp, _Py_clock_info_t *info, int raise)
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
if (_PyTime_FromTimespec(tp, &ts, raise) < 0) {
|
||||
if (pytime_fromtimespec(tp, &ts, raise) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -662,7 +729,7 @@ pygettimeofday(_PyTime_t *tp, _Py_clock_info_t *info, int raise)
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
if (_PyTime_FromTimeval(tp, &tv, raise) < 0) {
|
||||
if (pytime_fromtimeval(tp, &tv, raise) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -841,7 +908,7 @@ pymonotonic(_PyTime_t *tp, _Py_clock_info_t *info, int raise)
|
||||
}
|
||||
info->resolution = res.tv_sec + res.tv_nsec * 1e-9;
|
||||
}
|
||||
if (_PyTime_FromTimespec(tp, &ts, raise) < 0) {
|
||||
if (pytime_fromtimespec(tp, &ts, raise) < 0) {
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user