def do_poll(self, space, timeout): if not self._check_fd(): raise OperationError(space.w_IOError, space.wrap( "handle out of range in select()")) r, w, e = rpoll.select([self.fd], [], [], timeout) return bool(r)
def check_socket_and_wait_for_timeout(space, w_sock, writing): """If the socket has a timeout, do a select()/poll() on the socket. The argument writing indicates the direction. Returns one of the possibilities in the timeout_state enum (above).""" w_timeout = space.call_method(w_sock, "gettimeout") if space.is_w(w_timeout, space.w_None): return SOCKET_IS_BLOCKING elif space.float_w(w_timeout) == 0.0: return SOCKET_IS_NONBLOCKING sock_timeout = space.float_w(w_timeout) sock_fd = space.int_w(space.call_method(w_sock, "fileno")) # guard against closed socket if sock_fd < 0: return SOCKET_HAS_BEEN_CLOSED # see if the socket is ready # Prefer poll, if available, since you can poll() any fd # which can't be done with select(). if HAVE_RPOLL: if writing: fddict = {sock_fd: rpoll.POLLOUT} else: fddict = {sock_fd: rpoll.POLLIN} # socket's timeout is in seconds, poll's timeout in ms timeout = int(sock_timeout * 1000 + 0.5) ready = rpoll.poll(fddict, timeout) else: if MAX_FD_SIZE is not None and sock_fd >= MAX_FD_SIZE: return SOCKET_TOO_LARGE_FOR_SELECT if writing: r, w, e = rpoll.select([], [sock_fd], [], sock_timeout) ready = w else: r, w, e = rpoll.select([sock_fd], [], [], sock_timeout) ready = r if ready: return SOCKET_OPERATION_OK else: return SOCKET_HAS_TIMED_OUT
def do_poll(self, space, timeout): if not self._check_fd(): raise oefmt(space.w_IOError, "handle out of range in select()") r, w, e = rpoll.select([self.fd], [], [], timeout, handle_eintr=True) return bool(r)
fddict = {sock_fd: rpoll.POLLIN} # socket's timeout is in seconds, poll's timeout in ms timeout = int(sock_timeout * 1000 + 0.5) try: ready = rpoll.poll(fddict, timeout) except rpoll.PollError, e: message = e.get_msg() raise ssl_error(space, message, e.errno) else: if MAX_FD_SIZE is not None and sock_fd >= MAX_FD_SIZE: return SOCKET_TOO_LARGE_FOR_SELECT try: if writing: r, w, e = rpoll.select([], [sock_fd], [], sock_timeout) ready = w else: r, w, e = rpoll.select([sock_fd], [], [], sock_timeout) ready = r except rpoll.SelectError as e: message = e.get_msg() raise ssl_error(space, message, e.errno) if ready: return SOCKET_OPERATION_OK else: return SOCKET_HAS_TIMED_OUT def _ssl_seterror(space, ss, ret): assert ret <= 0