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 | |
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')
-rw-r--r-- | pym/_emerge/MetadataRegen.py | 2 | ||||
-rw-r--r-- | pym/_emerge/PollScheduler.py | 14 | ||||
-rw-r--r-- | pym/_emerge/QueueScheduler.py | 4 | ||||
-rw-r--r-- | pym/_emerge/Scheduler.py | 2 | ||||
-rw-r--r-- | pym/_emerge/TaskScheduler.py | 6 |
5 files changed, 19 insertions, 9 deletions
diff --git a/pym/_emerge/MetadataRegen.py b/pym/_emerge/MetadataRegen.py index 79446ee79..e82015fd1 100644 --- a/pym/_emerge/MetadataRegen.py +++ b/pym/_emerge/MetadataRegen.py @@ -11,7 +11,7 @@ class MetadataRegen(PollScheduler): def __init__(self, portdb, cp_iter=None, consumer=None, max_jobs=None, max_load=None): - PollScheduler.__init__(self) + PollScheduler.__init__(self, main=True) self._portdb = portdb self._global_cleanse = False if cp_iter is None: 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, diff --git a/pym/_emerge/QueueScheduler.py b/pym/_emerge/QueueScheduler.py index 9d73b7826..206087c7a 100644 --- a/pym/_emerge/QueueScheduler.py +++ b/pym/_emerge/QueueScheduler.py @@ -10,8 +10,8 @@ class QueueScheduler(PollScheduler): run() method returns when no tasks remain. """ - def __init__(self, max_jobs=None, max_load=None): - PollScheduler.__init__(self) + def __init__(self, main=True, max_jobs=None, max_load=None): + PollScheduler.__init__(self, main=main) if max_jobs is None: max_jobs = 1 diff --git a/pym/_emerge/Scheduler.py b/pym/_emerge/Scheduler.py index 5500acfbb..30a7e101b 100644 --- a/pym/_emerge/Scheduler.py +++ b/pym/_emerge/Scheduler.py @@ -137,7 +137,7 @@ class Scheduler(PollScheduler): def __init__(self, settings, trees, mtimedb, myopts, spinner, mergelist=None, favorites=None, graph_config=None, uninstall_only=False): - PollScheduler.__init__(self) + PollScheduler.__init__(self, main=True) if mergelist is not None: warnings.warn("The mergelist parameter of the " + \ diff --git a/pym/_emerge/TaskScheduler.py b/pym/_emerge/TaskScheduler.py index 71ac80f14..583bfe323 100644 --- a/pym/_emerge/TaskScheduler.py +++ b/pym/_emerge/TaskScheduler.py @@ -1,4 +1,4 @@ -# Copyright 1999-2009 Gentoo Foundation +# Copyright 1999-2012 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 from _emerge.QueueScheduler import QueueScheduler @@ -11,9 +11,9 @@ class TaskScheduler(object): add tasks and call run(). The run() method returns when no tasks remain. """ - def __init__(self, max_jobs=None, max_load=None): + def __init__(self, main=True, max_jobs=None, max_load=None): self._queue = SequentialTaskQueue(max_jobs=max_jobs) - self._scheduler = QueueScheduler( + self._scheduler = QueueScheduler(main=main, max_jobs=max_jobs, max_load=max_load) self.sched_iface = self._scheduler.sched_iface self.run = self._scheduler.run |