/* Convert a timestamp to a timeval structure (microsecond resolution).
tv_usec is always positive.
- Return -1 if the conversion overflowed, return 0 on success. */
+ Raise an exception and return -1 if the conversion overflowed,
+ return 0 on success. */
PyAPI_FUNC(int) _PyTime_AsTimeval(_PyTime_t t,
struct timeval *tv,
_PyTime_round_t round);
+/* Similar to _PyTime_AsTimeval(), but don't raise an exception on error. */
+PyAPI_FUNC(int) _PyTime_AsTimeval_noraise(_PyTime_t t,
+ struct timeval *tv,
+ _PyTime_round_t round);
+
#if defined(HAVE_CLOCK_GETTIME) || defined(HAVE_KQUEUE)
/* Convert a timestamp to a timespec structure (nanosecond resolution).
tv_nsec is always positive.
if (!_PyIsSelectable_fd(s->sock_fd))
return SOCKET_TOO_LARGE_FOR_SELECT;
- /* conversion was already checked for overflow when
- the timeout was set */
- (void)_PyTime_AsTimeval(s->sock_timeout, &tv, _PyTime_ROUND_UP);
+ _PyTime_AsTimeval_noraise(s->sock_timeout, &tv, _PyTime_ROUND_UP);
FD_ZERO(&fds);
FD_SET(s->sock_fd, &fds);
if (check_time_rounding(round) < 0)
return NULL;
t = _PyTime_FromNanoseconds(ns);
- if (_PyTime_AsTimeval(t, &tv, round) < 0) {
- PyErr_SetString(PyExc_OverflowError,
- "timeout doesn't fit into C timeval");
+ if (_PyTime_AsTimeval(t, &tv, round) < 0)
return NULL;
- }
seconds = PyLong_FromLong((PY_LONG_LONG)tv.tv_sec);
if (seconds == NULL)
n = poll(&pollfd, 1, timeout_int);
Py_END_ALLOW_THREADS;
#else
- /* conversion was already checked for overflow when
- the timeout was set */
- (void)_PyTime_AsTimeval(interval, &tv, _PyTime_ROUND_UP);
+ _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_UP);
FD_ZERO(&fds);
FD_SET(s->sock_fd, &fds);
struct timeval tv;
int conv;
- /* conversion was already checked for overflow when
- the timeout was set */
- (void)_PyTime_AsTimeval(s->sock_timeout, &tv, _PyTime_ROUND_UP);
+ _PyTime_AsTimeval_noraise(s->sock_timeout, &tv, _PyTime_ROUND_UP);
Py_BEGIN_ALLOW_THREADS
FD_ZERO(&fds);
do {
#ifndef MS_WINDOWS
- if (_PyTime_AsTimeval(secs, &timeout, _PyTime_ROUND_UP) < 0) {
- PyErr_SetString(PyExc_OverflowError,
- "delay doesn't fit into C timeval");
+ if (_PyTime_AsTimeval(secs, &timeout, _PyTime_ROUND_UP) < 0)
return -1;
- }
Py_BEGIN_ALLOW_THREADS
err = select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &timeout);
return _PyTime_Multiply(t, 1000 * 1000, round);
}
-int
-_PyTime_AsTimeval(_PyTime_t t, struct timeval *tv, _PyTime_round_t round)
+static int
+_PyTime_AsTimeval_impl(_PyTime_t t, struct timeval *tv, _PyTime_round_t round,
+ int raise)
{
_PyTime_t secs, ns;
int res = 0;
tv->tv_sec += 1;
}
+ if (res && raise)
+ _PyTime_overflow();
return res;
}
+int
+_PyTime_AsTimeval(_PyTime_t t, struct timeval *tv, _PyTime_round_t round)
+{
+ return _PyTime_AsTimeval_impl(t, tv, round, 1);
+}
+
+int
+_PyTime_AsTimeval_noraise(_PyTime_t t, struct timeval *tv, _PyTime_round_t round)
+{
+ return _PyTime_AsTimeval_impl(t, tv, round, 0);
+}
+
#if defined(HAVE_CLOCK_GETTIME) || defined(HAVE_KQUEUE)
int
_PyTime_AsTimespec(_PyTime_t t, struct timespec *ts)