diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2015-03-28 04:07:51 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2015-03-28 04:07:51 (GMT) |
commit | c337838af798354603457043e2ad8cfd3cbea36e (patch) | |
tree | 93582cec2713c341fb59358e61c87033e9121977 | |
parent | f5faad2bf017db9e99845de29420476914f1ef1d (diff) | |
download | cpython-c337838af798354603457043e2ad8cfd3cbea36e.zip cpython-c337838af798354603457043e2ad8cfd3cbea36e.tar.gz cpython-c337838af798354603457043e2ad8cfd3cbea36e.tar.bz2 |
Issue #22117: Use the new _PyTime_t API in the select module
-rw-r--r-- | Include/pytime.h | 2 | ||||
-rw-r--r-- | Modules/selectmodule.c | 59 | ||||
-rw-r--r-- | Python/pytime.c | 2 |
3 files changed, 22 insertions, 41 deletions
diff --git a/Include/pytime.h b/Include/pytime.h index 3078d25..6edffbd 100644 --- a/Include/pytime.h +++ b/Include/pytime.h @@ -124,7 +124,7 @@ PyAPI_FUNC(int) _PyTime_AsTimeval(_PyTime_t t, struct timeval *tv, _PyTime_round_t round); -#ifdef HAVE_CLOCK_GETTIME +#if defined(HAVE_CLOCK_GETTIME) || defined(HAVE_KQUEUE) /* 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. */ diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c index a65af2f..2c82ce7 100644 --- a/Modules/selectmodule.c +++ b/Modules/selectmodule.c @@ -206,38 +206,17 @@ select_select(PyObject *self, PyObject *args) if (tout == Py_None) tvp = (struct timeval *)0; - else if (!PyNumber_Check(tout)) { - PyErr_SetString(PyExc_TypeError, - "timeout must be a float or None"); - return NULL; - } else { - /* On OpenBSD 5.4, timeval.tv_sec is a long. - * Example: long is 64-bit, whereas time_t is 32-bit. */ - time_t sec; - /* On OS X 64-bit, timeval.tv_usec is an int (and thus still 4 - bytes as required), but no longer defined by a long. */ - long usec; - if (_PyTime_ObjectToTimeval(tout, &sec, &usec, - _PyTime_ROUND_UP) == -1) - return NULL; -#ifdef MS_WINDOWS - /* On Windows, timeval.tv_sec is a long (32 bit), - * whereas time_t can be 64-bit. */ - assert(sizeof(tv.tv_sec) == sizeof(long)); -#if SIZEOF_TIME_T > SIZEOF_LONG - if (sec > LONG_MAX) { - PyErr_SetString(PyExc_OverflowError, - "timeout is too large"); + _PyTime_t ts; + + if (_PyTime_FromSecondsObject(&ts, tout, _PyTime_ROUND_UP) < 0) { + PyErr_SetString(PyExc_TypeError, + "timeout must be a float or None"); return NULL; } -#endif - tv.tv_sec = (long)sec; -#else - assert(sizeof(tv.tv_sec) >= sizeof(sec)); - tv.tv_sec = sec; -#endif - tv.tv_usec = usec; + + if (_PyTime_AsTimeval(ts, &tv, _PyTime_ROUND_UP) == -1) + return NULL; if (tv.tv_sec < 0) { PyErr_SetString(PyExc_ValueError, "timeout must be non-negative"); return NULL; @@ -2032,9 +2011,18 @@ kqueue_queue_control(kqueue_queue_Object *self, PyObject *args) if (otimeout == Py_None || otimeout == NULL) { ptimeoutspec = NULL; } - else if (PyNumber_Check(otimeout)) { - if (_PyTime_ObjectToTimespec(otimeout, &timeout.tv_sec, - &timeout.tv_nsec, _PyTime_ROUND_UP) == -1) + else { + _PyTime_t ts; + + if (_PyTime_FromSecondsObject(&ts, otimeout, _PyTime_ROUND_UP) < 0) { + PyErr_Format(PyExc_TypeError, + "timeout argument must be an number " + "or None, got %.200s", + Py_TYPE(otimeout)->tp_name); + return NULL; + } + + if (_PyTime_AsTimespec(ts, &timeout) == -1) return NULL; if (timeout.tv_sec < 0) { @@ -2044,13 +2032,6 @@ kqueue_queue_control(kqueue_queue_Object *self, PyObject *args) } ptimeoutspec = &timeout; } - else { - PyErr_Format(PyExc_TypeError, - "timeout argument must be an number " - "or None, got %.200s", - Py_TYPE(otimeout)->tp_name); - return NULL; - } if (ch != NULL && ch != Py_None) { it = PyObject_GetIter(ch); diff --git a/Python/pytime.c b/Python/pytime.c index aa64977..27004f3 100644 --- a/Python/pytime.c +++ b/Python/pytime.c @@ -469,7 +469,7 @@ _PyTime_AsTimeval(_PyTime_t t, struct timeval *tv, _PyTime_round_t round) return res; } -#ifdef HAVE_CLOCK_GETTIME +#if defined(HAVE_CLOCK_GETTIME) || defined(HAVE_KQUEUE) int _PyTime_AsTimespec(_PyTime_t t, struct timespec *ts) { |