[Python-checkins] cpython: Issue #22117: Use the new _PyTime_t API in the select module

victor.stinner python-checkins at python.org
Sat Mar 28 05:20:04 CET 2015


https://hg.python.org/cpython/rev/930be74bbae5
changeset:   95237:930be74bbae5
user:        Victor Stinner <victor.stinner at gmail.com>
date:        Sat Mar 28 05:07:51 2015 +0100
summary:
  Issue #22117: Use the new _PyTime_t API in the select module

files:
  Include/pytime.h       |   2 +-
  Modules/selectmodule.c |  59 ++++++++++-------------------
  Python/pytime.c        |   2 +-
  3 files changed, 22 insertions(+), 41 deletions(-)


diff --git a/Include/pytime.h b/Include/pytime.h
--- a/Include/pytime.h
+++ b/Include/pytime.h
@@ -124,7 +124,7 @@
     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
--- a/Modules/selectmodule.c
+++ b/Modules/selectmodule.c
@@ -206,38 +206,17 @@
 
     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 @@
     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 @@
         }
         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
--- a/Python/pytime.c
+++ b/Python/pytime.c
@@ -469,7 +469,7 @@
     return res;
 }
 
-#ifdef HAVE_CLOCK_GETTIME
+#if defined(HAVE_CLOCK_GETTIME) || defined(HAVE_KQUEUE)
 int
 _PyTime_AsTimespec(_PyTime_t t, struct timespec *ts)
 {

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list