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 | |
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')
-rw-r--r-- | pym/portage/util/_eventloop/EventLoop.py | 5 | ||||
-rw-r--r-- | pym/portage/util/_eventloop/PollConstants.py | 18 | ||||
-rw-r--r-- | pym/portage/util/_eventloop/PollSelectAdapter.py | 74 |
3 files changed, 94 insertions, 3 deletions
diff --git a/pym/portage/util/_eventloop/EventLoop.py b/pym/portage/util/_eventloop/EventLoop.py index 763d3afd4..478faab77 100644 --- a/pym/portage/util/_eventloop/EventLoop.py +++ b/pym/portage/util/_eventloop/EventLoop.py @@ -11,9 +11,8 @@ import time from portage.util import writemsg_level from portage.util.SlotObject import SlotObject - -from _emerge.PollConstants import PollConstants -from _emerge.PollSelectAdapter import PollSelectAdapter +from portage.util._eventloop.PollConstants import PollConstants +from portage.util._eventloop.PollSelectAdapter import PollSelectAdapter class EventLoop(object): diff --git a/pym/portage/util/_eventloop/PollConstants.py b/pym/portage/util/_eventloop/PollConstants.py new file mode 100644 index 000000000..d0270a996 --- /dev/null +++ b/pym/portage/util/_eventloop/PollConstants.py @@ -0,0 +1,18 @@ +# Copyright 1999-2009 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +import select +class PollConstants(object): + + """ + Provides POLL* constants that are equivalent to those from the + select module, for use by PollSelectAdapter. + """ + + names = ("POLLIN", "POLLPRI", "POLLOUT", "POLLERR", "POLLHUP", "POLLNVAL") + v = 1 + for k in names: + locals()[k] = getattr(select, k, v) + v *= 2 + del k, v + 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 + |