mirror of https://github.com/python/cpython
Issue #22117: Use the new _PyTime_t API in the select module
This commit is contained in:
parent
f5faad2bf0
commit
c337838af7
|
@ -124,7 +124,7 @@ PyAPI_FUNC(int) _PyTime_AsTimeval(_PyTime_t t,
|
||||||
struct timeval *tv,
|
struct timeval *tv,
|
||||||
_PyTime_round_t round);
|
_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).
|
/* Convert a timestamp to a timespec structure (nanosecond resolution).
|
||||||
tv_nsec is always positive.
|
tv_nsec is always positive.
|
||||||
Raise an exception and return -1 on error, return 0 on success. */
|
Raise an exception and return -1 on error, return 0 on success. */
|
||||||
|
|
|
@ -206,38 +206,17 @@ select_select(PyObject *self, PyObject *args)
|
||||||
|
|
||||||
if (tout == Py_None)
|
if (tout == Py_None)
|
||||||
tvp = (struct timeval *)0;
|
tvp = (struct timeval *)0;
|
||||||
else if (!PyNumber_Check(tout)) {
|
|
||||||
PyErr_SetString(PyExc_TypeError,
|
|
||||||
"timeout must be a float or None");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
else {
|
else {
|
||||||
/* On OpenBSD 5.4, timeval.tv_sec is a long.
|
_PyTime_t ts;
|
||||||
* Example: long is 64-bit, whereas time_t is 32-bit. */
|
|
||||||
time_t sec;
|
if (_PyTime_FromSecondsObject(&ts, tout, _PyTime_ROUND_UP) < 0) {
|
||||||
/* On OS X 64-bit, timeval.tv_usec is an int (and thus still 4
|
PyErr_SetString(PyExc_TypeError,
|
||||||
bytes as required), but no longer defined by a long. */
|
"timeout must be a float or None");
|
||||||
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");
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
tv.tv_sec = (long)sec;
|
if (_PyTime_AsTimeval(ts, &tv, _PyTime_ROUND_UP) == -1)
|
||||||
#else
|
return NULL;
|
||||||
assert(sizeof(tv.tv_sec) >= sizeof(sec));
|
|
||||||
tv.tv_sec = sec;
|
|
||||||
#endif
|
|
||||||
tv.tv_usec = usec;
|
|
||||||
if (tv.tv_sec < 0) {
|
if (tv.tv_sec < 0) {
|
||||||
PyErr_SetString(PyExc_ValueError, "timeout must be non-negative");
|
PyErr_SetString(PyExc_ValueError, "timeout must be non-negative");
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -2032,9 +2011,18 @@ kqueue_queue_control(kqueue_queue_Object *self, PyObject *args)
|
||||||
if (otimeout == Py_None || otimeout == NULL) {
|
if (otimeout == Py_None || otimeout == NULL) {
|
||||||
ptimeoutspec = NULL;
|
ptimeoutspec = NULL;
|
||||||
}
|
}
|
||||||
else if (PyNumber_Check(otimeout)) {
|
else {
|
||||||
if (_PyTime_ObjectToTimespec(otimeout, &timeout.tv_sec,
|
_PyTime_t ts;
|
||||||
&timeout.tv_nsec, _PyTime_ROUND_UP) == -1)
|
|
||||||
|
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;
|
return NULL;
|
||||||
|
|
||||||
if (timeout.tv_sec < 0) {
|
if (timeout.tv_sec < 0) {
|
||||||
|
@ -2044,13 +2032,6 @@ kqueue_queue_control(kqueue_queue_Object *self, PyObject *args)
|
||||||
}
|
}
|
||||||
ptimeoutspec = &timeout;
|
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) {
|
if (ch != NULL && ch != Py_None) {
|
||||||
it = PyObject_GetIter(ch);
|
it = PyObject_GetIter(ch);
|
||||||
|
|
|
@ -469,7 +469,7 @@ _PyTime_AsTimeval(_PyTime_t t, struct timeval *tv, _PyTime_round_t round)
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_CLOCK_GETTIME
|
#if defined(HAVE_CLOCK_GETTIME) || defined(HAVE_KQUEUE)
|
||||||
int
|
int
|
||||||
_PyTime_AsTimespec(_PyTime_t t, struct timespec *ts)
|
_PyTime_AsTimespec(_PyTime_t t, struct timespec *ts)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue