diff options
author | Zac Medico <zmedico@gentoo.org> | 2012-02-17 14:56:21 -0800 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2012-02-17 14:56:21 -0800 |
commit | c37684d037834a51b036d861ee37890edded366e (patch) | |
tree | ddfcda06f2ff6abfdf83f6ba114353cc03ba6399 /pym/portage/util/_eventloop/PollSelectAdapter.py | |
parent | 6e6ef6f87f8cb2d51a53b2d4417c4b370f7ca495 (diff) | |
download | portage-c37684d037834a51b036d861ee37890edded366e.tar.gz portage-c37684d037834a51b036d861ee37890edded366e.tar.bz2 portage-c37684d037834a51b036d861ee37890edded366e.zip |
Move Poll{Constants,SelectAdapter} to _eventloop.
Diffstat (limited to 'pym/portage/util/_eventloop/PollSelectAdapter.py')
-rw-r--r-- | pym/portage/util/_eventloop/PollSelectAdapter.py | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/pym/portage/util/_eventloop/PollSelectAdapter.py b/pym/portage/util/_eventloop/PollSelectAdapter.py new file mode 100644 index 000000000..55f08f04c --- /dev/null +++ b/pym/portage/util/_eventloop/PollSelectAdapter.py @@ -0,0 +1,74 @@ +# Copyright 1999-2012 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +from portage.util._eventloop.PollConstants import PollConstants +import select + +class PollSelectAdapter(PollConstants): + + """ + Use select to emulate a poll object, for + systems that don't support poll(). + """ + + def __init__(self): + self._registered = {} + self._select_args = [[], [], []] + + def register(self, fd, *args): + """ + Only POLLIN is currently supported! + """ + if len(args) > 1: + raise TypeError( + "register expected at most 2 arguments, got " + \ + repr(1 + len(args))) + + eventmask = PollConstants.POLLIN | \ + PollConstants.POLLPRI | PollConstants.POLLOUT + if args: + eventmask = args[0] + + self._registered[fd] = eventmask + self._select_args = None + + def unregister(self, fd): + self._select_args = None + del self._registered[fd] + + def poll(self, *args): + if len(args) > 1: + raise TypeError( + "poll expected at most 2 arguments, got " + \ + repr(1 + len(args))) + + timeout = None + if args: + timeout = args[0] + + select_args = self._select_args + if select_args is None: + select_args = [list(self._registered), [], []] + + if timeout is not None: + select_args = select_args[:] + # Translate poll() timeout args to select() timeout args: + # + # | units | value(s) for indefinite block + # ---------|--------------|------------------------------ + # poll | milliseconds | omitted, negative, or None + # ---------|--------------|------------------------------ + # select | seconds | omitted + # ---------|--------------|------------------------------ + + if timeout is not None and timeout < 0: + timeout = None + if timeout is not None: + select_args.append(timeout / 1000) + + select_events = select.select(*select_args) + poll_events = [] + for fd in select_events[0]: + poll_events.append((fd, PollConstants.POLLIN)) + return poll_events + |