Example #1
0
    def __init__( self, sett ):
        self._evpoll = select.epoll()
        h.set_close_exec( self._evpoll.fileno() )
        self.poll_threshold = sett['poll_threshold']
        self.poll_timeout = sett['poll_timeout']

        # Book keeping
        self._handlers = {}
        """A map of polled descriptor and callback handlers."""
        self._events = {}
        self._callbacks = []
        self._callback_lock = threading.Lock()
        """Lock object to handle ioloop callbacks in a multi-threaded
        environment."""
        self._timeouts = []
        """A heap queue list to manage timeout events and its callbacks."""
        self._running = False
        """Initialized to True when start() is called and set to False to
        indicate that stop() is called."""
        self._stopped = False
        """Set to True when stop() is called and reset to False when start()
        exits."""
        self._thread_ident = None
        self._blocking_signal_threshold = None

        self._waker = Waker()
        """Create a pipe that we send bogus data to when we want to wake
        the I/O loop when it is idle."""

        # log.debug( "Adding poll-loop waker ..." )
        self.add_handler(
            self._waker.fileno(), lambda fd, events: self._waker.consume(),
            self.READ )
Example #2
0
def bind_sockets( port, address, family, backlog ):
    """Creates listening sockets bound to the given port and address.

    Returns a list of socket objects (multiple sockets are returned if
    the given address maps to multiple IP addresses, which is most common
    for mixed IPv4 and IPv6 use).

    Address may be either an IP address or hostname.  If it's a hostname,
    the server will listen on all IP addresses associated with the
    name.  Address may be an empty string or None to listen on all
    available interfaces.  Family may be set to either socket.AF_INET
    or socket.AF_INET6 to restrict to ipv4 or ipv6 addresses, otherwise
    both will be used if available.

    The ``backlog`` argument has the same meaning as for
    ``socket.listen()``.
    """
    family = family or socket.AF_UNSPEC
    sockets = []
    if address == "":
        address = None
    flags = socket.AI_PASSIVE
    if hasattr(socket, "AI_ADDRCONFIG"):
        # AI_ADDRCONFIG ensures that we only try to bind on ipv6
        # if the system is configured for it, but the flag doesn't
        # exist on some platforms (specifically WinXP, although
        # newer versions of windows have it)
        flags |= socket.AI_ADDRCONFIG
        addrinfo = set(
            socket.getaddrinfo(
                address, port, family, socket.SOCK_STREAM, 0, flags))
    for res in addrinfo :
        #log.info("Binding socket for %s", res)
        af, socktype, proto, canonname, sockaddr = res
        sock = socket.socket(af, socktype, proto)
        h.set_close_exec(sock.fileno())
        sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        if af == socket.AF_INET6:
            # On linux, ipv6 sockets accept ipv4 too by default,
            # but this makes it impossible to bind to both
            # 0.0.0.0 in ipv4 and :: in ipv6.  On other systems,
            # separate sockets *must* be used to listen for both ipv4
            # and ipv6.  For consistency, always disable ipv4 on our
            # ipv6 sockets and use a separate ipv4 socket when needed.
            #
            # Python 2.x on windows doesn't have IPPROTO_IPV6.
            if hasattr(socket, "IPPROTO_IPV6"):
                sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 1)
        #log.debug( "Set server socket to non-blocking mode ..." )
        sock.setblocking(0) # Set to non-blocking.
        sock.bind(sockaddr)
        #log.debug( "Server listening with a backlog of %s", backlog )
        sock.listen(backlog)
        sockets.append(sock)
    return sockets
Example #3
0
 def __init__(self):
     r, w = os.pipe()
     h.set_nonblocking(r, w)
     h.set_close_exec(r, w)
     self.reader = os.fdopen(r, "rb", 0)
     self.writer = os.fdopen(w, "wb", 0)