summaryrefslogtreecommitdiffstats
path: root/pym/portage/util/_eventloop
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2012-02-17 14:56:21 -0800
committerZac Medico <zmedico@gentoo.org>2012-02-17 14:56:21 -0800
commitc37684d037834a51b036d861ee37890edded366e (patch)
treeddfcda06f2ff6abfdf83f6ba114353cc03ba6399 /pym/portage/util/_eventloop
parent6e6ef6f87f8cb2d51a53b2d4417c4b370f7ca495 (diff)
downloadportage-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.py5
-rw-r--r--pym/portage/util/_eventloop/PollConstants.py18
-rw-r--r--pym/portage/util/_eventloop/PollSelectAdapter.py74
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
+