from portage import _encodings
from portage import _unicode_encode
from portage.util import writemsg_level
-from portage.util._eventloop.EventLoop import EventLoop
+from portage.util._eventloop.global_event_loop import global_event_loop
from _emerge.SlotObject import SlotObject
from _emerge.getloadavg import getloadavg
self._jobs = 0
self._scheduling = False
self._background = False
- self._event_loop = EventLoop()
+ self._event_loop = global_event_loop()
self.sched_iface = self._sched_iface_class(
idle_add=self._event_loop.idle_add,
io_add_watch=self._event_loop.io_add_watch,
class EventLoop(object):
+ supports_multiprocessing = True
+
class _idle_callback_class(SlotObject):
__slots__ = ("args", "callback", "source_id")
--- /dev/null
+# 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
--- /dev/null
+# 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