summaryrefslogtreecommitdiffstats
path: root/pym/_emerge/PollScheduler.py
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2012-05-10 23:32:26 -0700
committerZac Medico <zmedico@gentoo.org>2012-05-10 23:54:29 -0700
commit5228eb4ce60765cd421a5e363e51a71626739267 (patch)
treea6b97e25b48e73c290269f3e976e84be98acc922 /pym/_emerge/PollScheduler.py
parentb6ef0aedb1b1b7c6fd4ab2d8d38369724ec6c383 (diff)
downloadportage-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.py14
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,