diff options
author | Andy McCurdy <andy@andymccurdy.com> | 2019-02-11 23:33:21 -0800 |
---|---|---|
committer | Andy McCurdy <andy@andymccurdy.com> | 2019-02-11 23:33:21 -0800 |
commit | 363c05de10dd5f93af69ed768fbface316a30be9 (patch) | |
tree | 920ceb94db4daeb621e4d41a9bdc54fc122a3a34 /redis/selector.py | |
parent | 78c181b13d4f3b09e1257d633b65bd81df6be59c (diff) | |
download | redis-py-healty_connections.tar.gz |
test all selectors via pytest parameterizationhealty_connections
Diffstat (limited to 'redis/selector.py')
-rw-r--r-- | redis/selector.py | 49 |
1 files changed, 29 insertions, 20 deletions
diff --git a/redis/selector.py b/redis/selector.py index 11837bc..8c0ab8a 100644 --- a/redis/selector.py +++ b/redis/selector.py @@ -111,30 +111,37 @@ if hasattr(select, 'poll'): A poll-based selector that should work on (almost?) all versions of Unix """ - _EVENT_MASK = (select.POLLIN | select.POLLPRI | select.POLLOUT | - select.POLLERR | select.POLLHUP) - _READ_MASK = select.POLLIN | select.POLLPRI - _WRITE_MASK = select.POLLOUT + READ_MASK = select.POLLIN | select.POLLPRI + ERROR_MASK = select.POLLERR | select.POLLHUP + WRITE_MASK = select.POLLOUT + + _READ_POLLER_MASK = READ_MASK | ERROR_MASK + _READY_POLLER_MASK = READ_MASK | ERROR_MASK | WRITE_MASK def __init__(self, sock): super(PollSelector, self).__init__(sock) - self.poller = select.poll() - self.poller.register(sock, self._EVENT_MASK) + self.read_poller = select.poll() + self.read_poller.register(sock, self._READ_POLLER_MASK) + self.ready_poller = select.poll() + self.ready_poller.register(sock, self._READY_POLLER_MASK) def close(self): """ Close the selector. """ - try: - self.poller.unregister(self.sock) - except (KeyError, ValueError): - # KeyError is raised if somehow the socket was not registered - # ValueError is raised if the socket's file descriptor is - # negative. - # In either case, we can't do anything better than to remove - # the reference to the poller. - pass - self.poller = None + for poller in (self.read_poller, self.ready_poller): + try: + self.read_poller.unregister(self.sock) + except (KeyError, ValueError): + # KeyError is raised if somehow the socket was not + # registered + # ValueError is raised if the socket's file descriptor is + # negative. + # In either case, we can't do anything better than to + # remove the reference to the poller. + pass + self.read_poller = None + self.ready_poller = None self.sock = None def check_can_read(self, timeout=0): @@ -145,16 +152,18 @@ if hasattr(select, 'poll'): This doesn't guarentee that the socket is still connected, just that there is data to read. """ - events = self.poller.poll(0) - return bool(events and events[0][1] & self._READ_MASK) + timeout = int(timeout * 1000) + events = self.read_poller.poll(timeout) + return bool(events and events[0][1] & self.READ_MASK) def check_is_ready_for_command(self, timeout=0): """ Return True if the socket is ready to send a command, otherwise False """ - events = self.poller.poll(0) - return bool(events and events[0][1] == self._WRITE_MASK) + timeout = timeout * 1000 + events = self.ready_poller.poll(timeout) + return bool(events and events[0][1] == self.WRITE_MASK) def has_selector(selector): |