diff options
author | Zac Medico <zmedico@gentoo.org> | 2012-05-10 23:32:26 -0700 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2012-05-10 23:54:29 -0700 |
commit | 5228eb4ce60765cd421a5e363e51a71626739267 (patch) | |
tree | a6b97e25b48e73c290269f3e976e84be98acc922 /pym/_emerge/PollScheduler.py | |
parent | b6ef0aedb1b1b7c6fd4ab2d8d38369724ec6c383 (diff) | |
download | portage-5228eb4ce60765cd421a5e363e51a71626739267.tar.gz portage-5228eb4ce60765cd421a5e363e51a71626739267.tar.bz2 portage-5228eb4ce60765cd421a5e363e51a71626739267.zip |
PollScheduler: use local EventLoop (thread safe)
For API consumers, this makes the doebuild() function compatible with
threads, avoiding a ValueError raised by the signal module, as reported
at http://bugs.sabayon.org/show_bug.cgi?id=3305. Classes derived from
PollScheduler still use the signal module when possible.
Diffstat (limited to 'pym/_emerge/PollScheduler.py')
-rw-r--r-- | pym/_emerge/PollScheduler.py | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/pym/_emerge/PollScheduler.py b/pym/_emerge/PollScheduler.py index 1c631c3f2..965dc20ee 100644 --- a/pym/_emerge/PollScheduler.py +++ b/pym/_emerge/PollScheduler.py @@ -13,6 +13,7 @@ from portage import _encodings from portage import _unicode_encode from portage.util import writemsg_level from portage.util.SlotObject import SlotObject +from portage.util._eventloop.EventLoop import EventLoop from portage.util._eventloop.global_event_loop import global_event_loop from _emerge.getloadavg import getloadavg @@ -26,7 +27,13 @@ class PollScheduler(object): "output", "register", "run", "source_remove", "timeout_add", "unregister") - def __init__(self): + def __init__(self, main=False): + """ + @param main: If True then use global_event_loop(), otherwise use + a local EventLoop instance (default is False, for safe use in + a non-main thread) + @type main: bool + """ self._terminated = threading.Event() self._terminated_tasks = False self._max_jobs = 1 @@ -34,7 +41,10 @@ class PollScheduler(object): self._jobs = 0 self._scheduling = False self._background = False - self._event_loop = global_event_loop() + if main: + self._event_loop = global_event_loop() + else: + self._event_loop = EventLoop(main=False) self.sched_iface = self._sched_iface_class( IO_ERR=self._event_loop.IO_ERR, IO_HUP=self._event_loop.IO_HUP, |