summaryrefslogtreecommitdiffstats
path: root/pym/portage/util/_eventloop
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2012-02-09 12:04:42 -0800
committerZac Medico <zmedico@gentoo.org>2012-02-09 12:04:42 -0800
commit56337b00ea46d96037037816d7b5c7904825b8a9 (patch)
tree1f4c78f0571dcf2feab17030e4ccdd987839bff5 /pym/portage/util/_eventloop
parent7a6c34cc6bd6eb20a97e05347f87a0157f4ae58a (diff)
downloadportage-56337b00ea46d96037037816d7b5c7904825b8a9.tar.gz
portage-56337b00ea46d96037037816d7b5c7904825b8a9.tar.bz2
portage-56337b00ea46d96037037816d7b5c7904825b8a9.zip
Add global_event_loop() and GlibEventLoop.
This causes all PollScheduler instances within a given process to share a singleton EventLoop instance, and also makes it possible to swap in glib's main loop for all portage event loops in the main process.
Diffstat (limited to 'pym/portage/util/_eventloop')
-rw-r--r--pym/portage/util/_eventloop/EventLoop.py2
-rw-r--r--pym/portage/util/_eventloop/GlibEventLoop.py20
-rw-r--r--pym/portage/util/_eventloop/global_event_loop.py36
3 files changed, 58 insertions, 0 deletions
diff --git a/pym/portage/util/_eventloop/EventLoop.py b/pym/portage/util/_eventloop/EventLoop.py
index 3f4d35445..aa78ccd15 100644
--- a/pym/portage/util/_eventloop/EventLoop.py
+++ b/pym/portage/util/_eventloop/EventLoop.py
@@ -13,6 +13,8 @@ from _emerge.PollSelectAdapter import PollSelectAdapter
class EventLoop(object):
+ supports_multiprocessing = True
+
class _idle_callback_class(SlotObject):
__slots__ = ("args", "callback", "source_id")
diff --git a/pym/portage/util/_eventloop/GlibEventLoop.py b/pym/portage/util/_eventloop/GlibEventLoop.py
new file mode 100644
index 000000000..b35772e7f
--- /dev/null
+++ b/pym/portage/util/_eventloop/GlibEventLoop.py
@@ -0,0 +1,20 @@
+# Copyright 2012 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+import portage
+portage.proxy.lazyimport.lazyimport(globals(),
+ 'glib',
+)
+
+class GlibEventLoop(object):
+
+ # TODO: Support multiprocessing by using a separate glib.MainContext
+ # instance for each process.
+ supports_multiprocessing = False
+
+ def __init__(self):
+ self.iteration = glib.main_context_default().iteration
+ self.idle_add = glib.idle_add
+ self.io_add_watch = glib.io_add_watch
+ self.timeout_add = glib.timeout_add
+ self.source_remove = glib.source_remove
diff --git a/pym/portage/util/_eventloop/global_event_loop.py b/pym/portage/util/_eventloop/global_event_loop.py
new file mode 100644
index 000000000..0f0c53f2b
--- /dev/null
+++ b/pym/portage/util/_eventloop/global_event_loop.py
@@ -0,0 +1,36 @@
+# Copyright 2012 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+import os
+
+from portage.util._eventloop.EventLoop import EventLoop
+
+_default_constructor = EventLoop
+#from portage.util._eventloop.GlibEventLoop \
+# import GlibEventLoop as _default_constructor
+
+# If _default_constructor doesn't support multiprocessing,
+# then _multiprocessing_constructor is used in subprocesses.
+_multiprocessing_constructor = EventLoop
+
+_MAIN_PID = os.getpid()
+_instances = {}
+
+def global_event_loop():
+ """
+ Get a global EventLoop (or compatible object) instance which
+ belongs exclusively to the current process.
+ """
+
+ pid = os.getpid()
+ instance = _instances.get(pid)
+ if instance is not None:
+ return instance
+
+ constructor = _default_constructor
+ if not constructor.supports_multiprocessing and pid != _MAIN_PID:
+ constructor = _multiprocessing_constructor
+
+ instance = constructor()
+ _instances[pid] = instance
+ return instance