SILENT KILLERPanel

Current Path: > > opt > alt > python37 > lib64 > python3.7 >


Operation   : Linux premium131.web-hosting.com 4.18.0-553.44.1.lve.el8.x86_64 #1 SMP Thu Mar 13 14:29:12 UTC 2025 x86_64
Software     : Apache
Server IP    : 162.0.232.56 | Your IP: 216.73.216.111
Domains      : 1034 Domain(s)
Permission   : [ 0755 ]

Files and Folders in: //opt/alt/python37/lib64/python3.7/

NameTypeSizeLast ModifiedActions
__pycache__ Directory - -
asyncio Directory - -
collections Directory - -
concurrent Directory - -
config-3.7m Directory - -
ctypes Directory - -
curses Directory - -
dbm Directory - -
distutils Directory - -
email Directory - -
encodings Directory - -
ensurepip Directory - -
html Directory - -
http Directory - -
idlelib Directory - -
importlib Directory - -
json Directory - -
lib-dynload Directory - -
lib2to3 Directory - -
logging Directory - -
multiprocessing Directory - -
pydoc_data Directory - -
site-packages Directory - -
sqlite3 Directory - -
test Directory - -
unittest Directory - -
urllib Directory - -
venv Directory - -
wsgiref Directory - -
xml Directory - -
xmlrpc Directory - -
__future__.py File 5101 bytes April 17 2024 17:36:08.
__phello__.foo.py File 64 bytes April 17 2024 17:36:07.
_bootlocale.py File 1801 bytes April 17 2024 17:36:03.
_collections_abc.py File 26424 bytes April 17 2024 17:36:03.
_compat_pickle.py File 8749 bytes April 17 2024 17:36:07.
_compression.py File 5340 bytes April 17 2024 17:36:04.
_dummy_thread.py File 6027 bytes April 17 2024 17:36:07.
_markupbase.py File 14598 bytes April 17 2024 17:36:03.
_osx_support.py File 19600 bytes April 17 2024 17:36:07.
_py_abc.py File 6186 bytes April 17 2024 17:36:08.
_pydecimal.py File 228690 bytes April 17 2024 17:36:03.
_pyio.py File 91616 bytes April 17 2024 17:36:04.
_sitebuiltins.py File 3115 bytes April 17 2024 17:36:04.
_strptime.py File 25504 bytes April 17 2024 17:36:08.
_sysconfigdata_dm_linux_x86_64-linux-gnu.py File 31329 bytes April 17 2024 17:36:03.
_sysconfigdata_m_linux_x86_64-linux-gnu.py File 28600 bytes April 17 2024 17:36:08.
_threading_local.py File 7214 bytes April 17 2024 17:36:03.
_weakrefset.py File 5679 bytes April 17 2024 17:36:03.
abc.py File 5580 bytes April 17 2024 17:36:03.
aifc.py File 32814 bytes April 17 2024 17:36:08.
antigravity.py File 477 bytes April 17 2024 17:36:04.
argparse.py File 95372 bytes April 17 2024 17:36:07.
ast.py File 12842 bytes April 17 2024 17:36:07.
asynchat.py File 11328 bytes April 17 2024 17:36:07.
asyncore.py File 20118 bytes April 17 2024 17:36:08.
base64.py File 20393 bytes April 17 2024 17:36:04.
bdb.py File 31730 bytes April 17 2024 17:36:07.
binhex.py File 13954 bytes April 17 2024 17:36:03.
bisect.py File 2557 bytes April 17 2024 17:36:03.
bz2.py File 12410 bytes April 17 2024 17:36:07.
cProfile.py File 6253 bytes April 17 2024 17:36:03.
calendar.py File 24826 bytes April 17 2024 17:36:07.
cgi.py File 35050 bytes April 17 2024 17:36:07.
cgitb.py File 12018 bytes April 17 2024 17:36:08.
chunk.py File 5435 bytes April 17 2024 17:36:04.
cmd.py File 14860 bytes April 17 2024 17:36:03.
code.py File 10622 bytes April 17 2024 17:36:04.
codecs.py File 36615 bytes April 17 2024 17:36:03.
codeop.py File 6275 bytes April 17 2024 17:36:03.
colorsys.py File 4064 bytes April 17 2024 17:36:03.
compileall.py File 13788 bytes April 17 2024 17:36:03.
configparser.py File 54283 bytes April 17 2024 17:36:03.
contextlib.py File 24763 bytes April 17 2024 17:36:03.
contextvars.py File 129 bytes April 17 2024 17:36:07.
copy.py File 8856 bytes April 17 2024 17:36:03.
copyreg.py File 7017 bytes April 17 2024 17:36:07.
crypt.py File 3346 bytes April 17 2024 17:36:03.
csv.py File 16180 bytes April 17 2024 17:36:03.
dataclasses.py File 49520 bytes April 17 2024 17:36:07.
datetime.py File 86544 bytes April 17 2024 17:36:08.
decimal.py File 320 bytes April 17 2024 17:36:07.
difflib.py File 84393 bytes April 17 2024 17:36:04.
dis.py File 19888 bytes April 17 2024 17:36:03.
doctest.py File 104560 bytes April 17 2024 17:36:03.
dummy_threading.py File 2815 bytes April 17 2024 17:36:03.
enum.py File 35043 bytes April 17 2024 17:36:04.
filecmp.py File 9830 bytes April 17 2024 17:36:03.
fileinput.py File 14625 bytes April 17 2024 17:36:04.
fnmatch.py File 4056 bytes April 17 2024 17:36:03.
formatter.py File 15143 bytes April 17 2024 17:36:03.
fractions.py File 23752 bytes April 17 2024 17:36:03.
ftplib.py File 35618 bytes April 17 2024 17:36:03.
functools.py File 32932 bytes April 17 2024 17:36:08.
genericpath.py File 4912 bytes April 17 2024 17:36:08.
getopt.py File 7489 bytes April 17 2024 17:36:07.
getpass.py File 5994 bytes April 17 2024 17:36:03.
gettext.py File 21967 bytes April 17 2024 17:36:07.
glob.py File 5638 bytes April 17 2024 17:36:03.
gzip.py File 20637 bytes April 17 2024 17:36:07.
hashlib.py File 9534 bytes April 17 2024 17:36:08.
heapq.py File 23017 bytes April 17 2024 17:36:03.
hmac.py File 6517 bytes April 17 2024 17:36:04.
imaplib.py File 53292 bytes April 17 2024 17:36:07.
imghdr.py File 3795 bytes April 17 2024 17:36:07.
imp.py File 10536 bytes April 17 2024 17:36:03.
inspect.py File 117635 bytes April 17 2024 17:36:07.
io.py File 3517 bytes April 17 2024 17:36:03.
ipaddress.py File 73578 bytes April 17 2024 17:36:07.
keyword.py File 2256 bytes April 17 2024 17:36:07.
linecache.py File 5330 bytes April 17 2024 17:36:04.
locale.py File 78191 bytes April 17 2024 17:36:07.
lzma.py File 12983 bytes April 17 2024 17:36:08.
macpath.py File 6123 bytes April 17 2024 17:36:03.
mailbox.py File 78654 bytes April 17 2024 17:36:07.
mailcap.py File 9067 bytes April 17 2024 17:36:03.
mimetypes.py File 21496 bytes April 17 2024 17:36:07.
modulefinder.py File 23035 bytes April 17 2024 17:36:03.
netrc.py File 5566 bytes April 17 2024 17:36:04.
nntplib.py File 43087 bytes April 17 2024 17:36:03.
ntpath.py File 22340 bytes April 17 2024 17:36:03.
nturl2path.py File 2584 bytes April 17 2024 17:36:07.
numbers.py File 10244 bytes April 17 2024 17:36:08.
opcode.py File 5824 bytes April 17 2024 17:36:08.
operator.py File 10863 bytes April 17 2024 17:36:07.
optparse.py File 60371 bytes April 17 2024 17:36:07.
os.py File 37901 bytes April 17 2024 17:36:03.
pathlib.py File 50329 bytes April 17 2024 17:36:07.
pdb.py File 62505 bytes April 17 2024 17:36:04.
pickle.py File 57994 bytes April 17 2024 17:36:04.
pickletools.py File 91220 bytes April 17 2024 17:36:03.
pipes.py File 8916 bytes April 17 2024 17:36:07.
pkgutil.py File 21461 bytes April 17 2024 17:36:03.
platform.py File 46994 bytes April 17 2024 17:36:03.
plistlib.py File 30709 bytes April 17 2024 17:36:03.
poplib.py File 14964 bytes April 17 2024 17:36:03.
posixpath.py File 15771 bytes April 17 2024 17:36:04.
pprint.py File 20884 bytes April 17 2024 17:36:03.
profile.py File 22494 bytes April 17 2024 17:36:04.
pstats.py File 27315 bytes April 17 2024 17:36:03.
pty.py File 4763 bytes April 17 2024 17:36:03.
py_compile.py File 8001 bytes April 17 2024 17:36:07.
pyclbr.py File 15137 bytes April 17 2024 17:36:03.
pydoc.py File 105876 bytes April 17 2024 17:36:03.
queue.py File 11359 bytes April 17 2024 17:36:07.
quopri.py File 7265 bytes April 17 2024 17:36:07.
random.py File 27557 bytes April 17 2024 17:36:03.
re.py File 15306 bytes April 17 2024 17:36:04.
reprlib.py File 5267 bytes April 17 2024 17:36:03.
rlcompleter.py File 7097 bytes April 17 2024 17:36:08.
runpy.py File 11959 bytes April 17 2024 17:36:03.
sched.py File 6442 bytes April 17 2024 17:36:07.
secrets.py File 2038 bytes April 17 2024 17:36:04.
selectors.py File 18561 bytes April 17 2024 17:36:03.
shelve.py File 8527 bytes April 17 2024 17:36:07.
shlex.py File 13100 bytes April 17 2024 17:36:08.
shutil.py File 41950 bytes April 17 2024 17:36:07.
signal.py File 2123 bytes April 17 2024 17:36:07.
site.py File 21575 bytes April 17 2024 17:36:07.
smtpd.py File 34722 bytes April 17 2024 17:36:04.
smtplib.py File 44443 bytes April 17 2024 17:36:03.
sndhdr.py File 7086 bytes April 17 2024 17:36:07.
socket.py File 27469 bytes April 17 2024 17:36:08.
socketserver.py File 26923 bytes April 17 2024 17:36:08.
sre_compile.py File 26872 bytes April 17 2024 17:36:03.
sre_constants.py File 7177 bytes April 17 2024 17:36:03.
sre_parse.py File 39156 bytes April 17 2024 17:36:04.
ssl.py File 45495 bytes April 17 2024 17:36:07.
stat.py File 5391 bytes April 17 2024 17:36:07.
statistics.py File 20651 bytes April 17 2024 17:36:03.
string.py File 11564 bytes April 17 2024 17:36:07.
stringprep.py File 12917 bytes April 17 2024 17:36:04.
struct.py File 257 bytes April 17 2024 17:36:04.
subprocess.py File 72649 bytes April 17 2024 17:36:03.
sunau.py File 18375 bytes April 17 2024 17:36:03.
symbol.py File 2142 bytes April 17 2024 17:36:03.
symtable.py File 7279 bytes April 17 2024 17:36:07.
sysconfig.py File 24440 bytes April 17 2024 17:36:07.
tabnanny.py File 11419 bytes April 17 2024 17:36:07.
tarfile.py File 92675 bytes April 17 2024 17:36:03.
telnetlib.py File 23135 bytes April 17 2024 17:36:03.
tempfile.py File 26730 bytes April 17 2024 17:36:03.
textwrap.py File 19407 bytes April 17 2024 17:36:03.
this.py File 1003 bytes April 17 2024 17:36:04.
threading.py File 49284 bytes April 17 2024 17:36:07.
timeit.py File 13493 bytes April 17 2024 17:36:03.
token.py File 3763 bytes April 17 2024 17:36:03.
tokenize.py File 27031 bytes April 17 2024 17:36:07.
trace.py File 28903 bytes April 17 2024 17:36:03.
traceback.py File 23437 bytes April 17 2024 17:36:07.
tracemalloc.py File 17076 bytes April 17 2024 17:36:07.
tty.py File 879 bytes April 17 2024 17:36:03.
types.py File 9897 bytes April 17 2024 17:36:03.
typing.py File 56438 bytes April 17 2024 17:36:07.
uu.py File 7277 bytes April 17 2024 17:36:03.
uuid.py File 29518 bytes April 17 2024 17:36:03.
warnings.py File 20080 bytes April 17 2024 17:36:03.
wave.py File 18230 bytes April 17 2024 17:36:03.
weakref.py File 21508 bytes April 17 2024 17:36:07.
webbrowser.py File 23715 bytes April 17 2024 17:36:07.
xdrlib.py File 5913 bytes April 17 2024 17:36:08.
zipapp.py File 7535 bytes April 17 2024 17:36:03.
zipfile.py File 81094 bytes April 17 2024 17:36:08.

Reading File: //opt/alt/python37/lib64/python3.7//selectors.py

"""Selectors module.

This module allows high-level and efficient I/O multiplexing, built upon the
`select` module primitives.
"""


from abc import ABCMeta, abstractmethod
from collections import namedtuple
from collections.abc import Mapping
import math
import select
import sys


# generic events, that must be mapped to implementation-specific ones
EVENT_READ = (1 << 0)
EVENT_WRITE = (1 << 1)


def _fileobj_to_fd(fileobj):
    """Return a file descriptor from a file object.

    Parameters:
    fileobj -- file object or file descriptor

    Returns:
    corresponding file descriptor

    Raises:
    ValueError if the object is invalid
    """
    if isinstance(fileobj, int):
        fd = fileobj
    else:
        try:
            fd = int(fileobj.fileno())
        except (AttributeError, TypeError, ValueError):
            raise ValueError("Invalid file object: "
                             "{!r}".format(fileobj)) from None
    if fd < 0:
        raise ValueError("Invalid file descriptor: {}".format(fd))
    return fd


SelectorKey = namedtuple('SelectorKey', ['fileobj', 'fd', 'events', 'data'])

SelectorKey.__doc__ = """SelectorKey(fileobj, fd, events, data)

    Object used to associate a file object to its backing
    file descriptor, selected event mask, and attached data.
"""
if sys.version_info >= (3, 5):
    SelectorKey.fileobj.__doc__ = 'File object registered.'
    SelectorKey.fd.__doc__ = 'Underlying file descriptor.'
    SelectorKey.events.__doc__ = 'Events that must be waited for on this file object.'
    SelectorKey.data.__doc__ = ('''Optional opaque data associated to this file object.
    For example, this could be used to store a per-client session ID.''')

class _SelectorMapping(Mapping):
    """Mapping of file objects to selector keys."""

    def __init__(self, selector):
        self._selector = selector

    def __len__(self):
        return len(self._selector._fd_to_key)

    def __getitem__(self, fileobj):
        try:
            fd = self._selector._fileobj_lookup(fileobj)
            return self._selector._fd_to_key[fd]
        except KeyError:
            raise KeyError("{!r} is not registered".format(fileobj)) from None

    def __iter__(self):
        return iter(self._selector._fd_to_key)


class BaseSelector(metaclass=ABCMeta):
    """Selector abstract base class.

    A selector supports registering file objects to be monitored for specific
    I/O events.

    A file object is a file descriptor or any object with a `fileno()` method.
    An arbitrary object can be attached to the file object, which can be used
    for example to store context information, a callback, etc.

    A selector can use various implementations (select(), poll(), epoll()...)
    depending on the platform. The default `Selector` class uses the most
    efficient implementation on the current platform.
    """

    @abstractmethod
    def register(self, fileobj, events, data=None):
        """Register a file object.

        Parameters:
        fileobj -- file object or file descriptor
        events  -- events to monitor (bitwise mask of EVENT_READ|EVENT_WRITE)
        data    -- attached data

        Returns:
        SelectorKey instance

        Raises:
        ValueError if events is invalid
        KeyError if fileobj is already registered
        OSError if fileobj is closed or otherwise is unacceptable to
                the underlying system call (if a system call is made)

        Note:
        OSError may or may not be raised
        """
        raise NotImplementedError

    @abstractmethod
    def unregister(self, fileobj):
        """Unregister a file object.

        Parameters:
        fileobj -- file object or file descriptor

        Returns:
        SelectorKey instance

        Raises:
        KeyError if fileobj is not registered

        Note:
        If fileobj is registered but has since been closed this does
        *not* raise OSError (even if the wrapped syscall does)
        """
        raise NotImplementedError

    def modify(self, fileobj, events, data=None):
        """Change a registered file object monitored events or attached data.

        Parameters:
        fileobj -- file object or file descriptor
        events  -- events to monitor (bitwise mask of EVENT_READ|EVENT_WRITE)
        data    -- attached data

        Returns:
        SelectorKey instance

        Raises:
        Anything that unregister() or register() raises
        """
        self.unregister(fileobj)
        return self.register(fileobj, events, data)

    @abstractmethod
    def select(self, timeout=None):
        """Perform the actual selection, until some monitored file objects are
        ready or a timeout expires.

        Parameters:
        timeout -- if timeout > 0, this specifies the maximum wait time, in
                   seconds
                   if timeout <= 0, the select() call won't block, and will
                   report the currently ready file objects
                   if timeout is None, select() will block until a monitored
                   file object becomes ready

        Returns:
        list of (key, events) for ready file objects
        `events` is a bitwise mask of EVENT_READ|EVENT_WRITE
        """
        raise NotImplementedError

    def close(self):
        """Close the selector.

        This must be called to make sure that any underlying resource is freed.
        """
        pass

    def get_key(self, fileobj):
        """Return the key associated to a registered file object.

        Returns:
        SelectorKey for this file object
        """
        mapping = self.get_map()
        if mapping is None:
            raise RuntimeError('Selector is closed')
        try:
            return mapping[fileobj]
        except KeyError:
            raise KeyError("{!r} is not registered".format(fileobj)) from None

    @abstractmethod
    def get_map(self):
        """Return a mapping of file objects to selector keys."""
        raise NotImplementedError

    def __enter__(self):
        return self

    def __exit__(self, *args):
        self.close()


class _BaseSelectorImpl(BaseSelector):
    """Base selector implementation."""

    def __init__(self):
        # this maps file descriptors to keys
        self._fd_to_key = {}
        # read-only mapping returned by get_map()
        self._map = _SelectorMapping(self)

    def _fileobj_lookup(self, fileobj):
        """Return a file descriptor from a file object.

        This wraps _fileobj_to_fd() to do an exhaustive search in case
        the object is invalid but we still have it in our map.  This
        is used by unregister() so we can unregister an object that
        was previously registered even if it is closed.  It is also
        used by _SelectorMapping.
        """
        try:
            return _fileobj_to_fd(fileobj)
        except ValueError:
            # Do an exhaustive search.
            for key in self._fd_to_key.values():
                if key.fileobj is fileobj:
                    return key.fd
            # Raise ValueError after all.
            raise

    def register(self, fileobj, events, data=None):
        if (not events) or (events & ~(EVENT_READ | EVENT_WRITE)):
            raise ValueError("Invalid events: {!r}".format(events))

        key = SelectorKey(fileobj, self._fileobj_lookup(fileobj), events, data)

        if key.fd in self._fd_to_key:
            raise KeyError("{!r} (FD {}) is already registered"
                           .format(fileobj, key.fd))

        self._fd_to_key[key.fd] = key
        return key

    def unregister(self, fileobj):
        try:
            key = self._fd_to_key.pop(self._fileobj_lookup(fileobj))
        except KeyError:
            raise KeyError("{!r} is not registered".format(fileobj)) from None
        return key

    def modify(self, fileobj, events, data=None):
        try:
            key = self._fd_to_key[self._fileobj_lookup(fileobj)]
        except KeyError:
            raise KeyError("{!r} is not registered".format(fileobj)) from None
        if events != key.events:
            self.unregister(fileobj)
            key = self.register(fileobj, events, data)
        elif data != key.data:
            # Use a shortcut to update the data.
            key = key._replace(data=data)
            self._fd_to_key[key.fd] = key
        return key

    def close(self):
        self._fd_to_key.clear()
        self._map = None

    def get_map(self):
        return self._map

    def _key_from_fd(self, fd):
        """Return the key associated to a given file descriptor.

        Parameters:
        fd -- file descriptor

        Returns:
        corresponding key, or None if not found
        """
        try:
            return self._fd_to_key[fd]
        except KeyError:
            return None


class SelectSelector(_BaseSelectorImpl):
    """Select-based selector."""

    def __init__(self):
        super().__init__()
        self._readers = set()
        self._writers = set()

    def register(self, fileobj, events, data=None):
        key = super().register(fileobj, events, data)
        if events & EVENT_READ:
            self._readers.add(key.fd)
        if events & EVENT_WRITE:
            self._writers.add(key.fd)
        return key

    def unregister(self, fileobj):
        key = super().unregister(fileobj)
        self._readers.discard(key.fd)
        self._writers.discard(key.fd)
        return key

    if sys.platform == 'win32':
        def _select(self, r, w, _, timeout=None):
            r, w, x = select.select(r, w, w, timeout)
            return r, w + x, []
    else:
        _select = select.select

    def select(self, timeout=None):
        timeout = None if timeout is None else max(timeout, 0)
        ready = []
        try:
            r, w, _ = self._select(self._readers, self._writers, [], timeout)
        except InterruptedError:
            return ready
        r = set(r)
        w = set(w)
        for fd in r | w:
            events = 0
            if fd in r:
                events |= EVENT_READ
            if fd in w:
                events |= EVENT_WRITE

            key = self._key_from_fd(fd)
            if key:
                ready.append((key, events & key.events))
        return ready


class _PollLikeSelector(_BaseSelectorImpl):
    """Base class shared between poll, epoll and devpoll selectors."""
    _selector_cls = None
    _EVENT_READ = None
    _EVENT_WRITE = None

    def __init__(self):
        super().__init__()
        self._selector = self._selector_cls()

    def register(self, fileobj, events, data=None):
        key = super().register(fileobj, events, data)
        poller_events = 0
        if events & EVENT_READ:
            poller_events |= self._EVENT_READ
        if events & EVENT_WRITE:
            poller_events |= self._EVENT_WRITE
        try:
            self._selector.register(key.fd, poller_events)
        except:
            super().unregister(fileobj)
            raise
        return key

    def unregister(self, fileobj):
        key = super().unregister(fileobj)
        try:
            self._selector.unregister(key.fd)
        except OSError:
            # This can happen if the FD was closed since it
            # was registered.
            pass
        return key

    def modify(self, fileobj, events, data=None):
        try:
            key = self._fd_to_key[self._fileobj_lookup(fileobj)]
        except KeyError:
            raise KeyError(f"{fileobj!r} is not registered") from None

        changed = False
        if events != key.events:
            selector_events = 0
            if events & EVENT_READ:
                selector_events |= self._EVENT_READ
            if events & EVENT_WRITE:
                selector_events |= self._EVENT_WRITE
            try:
                self._selector.modify(key.fd, selector_events)
            except:
                super().unregister(fileobj)
                raise
            changed = True
        if data != key.data:
            changed = True

        if changed:
            key = key._replace(events=events, data=data)
            self._fd_to_key[key.fd] = key
        return key

    def select(self, timeout=None):
        # This is shared between poll() and epoll().
        # epoll() has a different signature and handling of timeout parameter.
        if timeout is None:
            timeout = None
        elif timeout <= 0:
            timeout = 0
        else:
            # poll() has a resolution of 1 millisecond, round away from
            # zero to wait *at least* timeout seconds.
            timeout = math.ceil(timeout * 1e3)
        ready = []
        try:
            fd_event_list = self._selector.poll(timeout)
        except InterruptedError:
            return ready
        for fd, event in fd_event_list:
            events = 0
            if event & ~self._EVENT_READ:
                events |= EVENT_WRITE
            if event & ~self._EVENT_WRITE:
                events |= EVENT_READ

            key = self._key_from_fd(fd)
            if key:
                ready.append((key, events & key.events))
        return ready


if hasattr(select, 'poll'):

    class PollSelector(_PollLikeSelector):
        """Poll-based selector."""
        _selector_cls = select.poll
        _EVENT_READ = select.POLLIN
        _EVENT_WRITE = select.POLLOUT


if hasattr(select, 'epoll'):

    class EpollSelector(_PollLikeSelector):
        """Epoll-based selector."""
        _selector_cls = select.epoll
        _EVENT_READ = select.EPOLLIN
        _EVENT_WRITE = select.EPOLLOUT

        def fileno(self):
            return self._selector.fileno()

        def select(self, timeout=None):
            if timeout is None:
                timeout = -1
            elif timeout <= 0:
                timeout = 0
            else:
                # epoll_wait() has a resolution of 1 millisecond, round away
                # from zero to wait *at least* timeout seconds.
                timeout = math.ceil(timeout * 1e3) * 1e-3

            # epoll_wait() expects `maxevents` to be greater than zero;
            # we want to make sure that `select()` can be called when no
            # FD is registered.
            max_ev = max(len(self._fd_to_key), 1)

            ready = []
            try:
                fd_event_list = self._selector.poll(timeout, max_ev)
            except InterruptedError:
                return ready
            for fd, event in fd_event_list:
                events = 0
                if event & ~select.EPOLLIN:
                    events |= EVENT_WRITE
                if event & ~select.EPOLLOUT:
                    events |= EVENT_READ

                key = self._key_from_fd(fd)
                if key:
                    ready.append((key, events & key.events))
            return ready

        def close(self):
            self._selector.close()
            super().close()


if hasattr(select, 'devpoll'):

    class DevpollSelector(_PollLikeSelector):
        """Solaris /dev/poll selector."""
        _selector_cls = select.devpoll
        _EVENT_READ = select.POLLIN
        _EVENT_WRITE = select.POLLOUT

        def fileno(self):
            return self._selector.fileno()

        def close(self):
            self._selector.close()
            super().close()


if hasattr(select, 'kqueue'):

    class KqueueSelector(_BaseSelectorImpl):
        """Kqueue-based selector."""

        def __init__(self):
            super().__init__()
            self._selector = select.kqueue()

        def fileno(self):
            return self._selector.fileno()

        def register(self, fileobj, events, data=None):
            key = super().register(fileobj, events, data)
            try:
                if events & EVENT_READ:
                    kev = select.kevent(key.fd, select.KQ_FILTER_READ,
                                        select.KQ_EV_ADD)
                    self._selector.control([kev], 0, 0)
                if events & EVENT_WRITE:
                    kev = select.kevent(key.fd, select.KQ_FILTER_WRITE,
                                        select.KQ_EV_ADD)
                    self._selector.control([kev], 0, 0)
            except:
                super().unregister(fileobj)
                raise
            return key

        def unregister(self, fileobj):
            key = super().unregister(fileobj)
            if key.events & EVENT_READ:
                kev = select.kevent(key.fd, select.KQ_FILTER_READ,
                                    select.KQ_EV_DELETE)
                try:
                    self._selector.control([kev], 0, 0)
                except OSError:
                    # This can happen if the FD was closed since it
                    # was registered.
                    pass
            if key.events & EVENT_WRITE:
                kev = select.kevent(key.fd, select.KQ_FILTER_WRITE,
                                    select.KQ_EV_DELETE)
                try:
                    self._selector.control([kev], 0, 0)
                except OSError:
                    # See comment above.
                    pass
            return key

        def select(self, timeout=None):
            timeout = None if timeout is None else max(timeout, 0)
            max_ev = len(self._fd_to_key)
            ready = []
            try:
                kev_list = self._selector.control(None, max_ev, timeout)
            except InterruptedError:
                return ready
            for kev in kev_list:
                fd = kev.ident
                flag = kev.filter
                events = 0
                if flag == select.KQ_FILTER_READ:
                    events |= EVENT_READ
                if flag == select.KQ_FILTER_WRITE:
                    events |= EVENT_WRITE

                key = self._key_from_fd(fd)
                if key:
                    ready.append((key, events & key.events))
            return ready

        def close(self):
            self._selector.close()
            super().close()


# Choose the best implementation, roughly:
#    epoll|kqueue|devpoll > poll > select.
# select() also can't accept a FD > FD_SETSIZE (usually around 1024)
if 'KqueueSelector' in globals():
    DefaultSelector = KqueueSelector
elif 'EpollSelector' in globals():
    DefaultSelector = EpollSelector
elif 'DevpollSelector' in globals():
    DefaultSelector = DevpollSelector
elif 'PollSelector' in globals():
    DefaultSelector = PollSelector
else:
    DefaultSelector = SelectSelector

SILENT KILLER Tool