[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