Close #20656: Fix select.select() on OpenBSD 64-bit

This commit is contained in:
Victor Stinner 2014-02-18 01:35:40 +01:00
parent 5afffeab73
commit 5a8e5796f1
1 changed files with 12 additions and 10 deletions

View File

@ -212,11 +212,18 @@ select_select(PyObject *self, PyObject *args)
return NULL; return NULL;
} }
else { else {
#ifdef MS_WINDOWS /* On OpenBSD 5.4, timeval.tv_sec is a long.
* Example: long is 64-bit, whereas time_t is 32-bit. */
time_t sec; time_t sec;
if (_PyTime_ObjectToTimeval(tout, &sec, &tv.tv_usec, /* 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) _PyTime_ROUND_UP) == -1)
return NULL; 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)); assert(sizeof(tv.tv_sec) == sizeof(long));
#if SIZEOF_TIME_T > SIZEOF_LONG #if SIZEOF_TIME_T > SIZEOF_LONG
if (sec > LONG_MAX) { if (sec > LONG_MAX) {
@ -225,16 +232,11 @@ select_select(PyObject *self, PyObject *args)
return NULL; return NULL;
} }
#endif #endif
tv.tv_sec = (long)sec;
#else #else
/* 64-bit OS X has struct timeval.tv_usec as an int (and thus still 4 assert(sizeof(tv.tv_sec) >= sizeof(sec));
bytes as required), but no longer defined by a long. */
long tv_usec;
if (_PyTime_ObjectToTimeval(tout, &tv.tv_sec, &tv_usec,
_PyTime_ROUND_UP) == -1)
return NULL;
tv.tv_usec = tv_usec;
#endif #endif
tv.tv_sec = sec;
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;