aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2020-02-29 00:33:46 -0800
committerZac Medico <zmedico@gentoo.org>2020-02-29 00:34:34 -0800
commit8074127bbc213fde75d51309c8fb4ee33ad278aa (patch)
tree7fc3436a9f26190e512681ab199b542b76eb479f /lib
parentFileDigester: eliminate _pipe_logger_exit with _async_waitpid (diff)
downloadportage-8074127bbc213fde75d51309c8fb4ee33ad278aa.tar.gz
portage-8074127bbc213fde75d51309c8fb4ee33ad278aa.tar.bz2
portage-8074127bbc213fde75d51309c8fb4ee33ad278aa.zip
SpawnProcess: add _main coroutine
Add a _main coroutine method and make the PipeLogger instance a local variable. Signed-off-by: Zac Medico <zmedico@gentoo.org>
Diffstat (limited to 'lib')
-rw-r--r--lib/_emerge/SpawnProcess.py33
1 files changed, 22 insertions, 11 deletions
diff --git a/lib/_emerge/SpawnProcess.py b/lib/_emerge/SpawnProcess.py
index ba58d9d0e..cda615ded 100644
--- a/lib/_emerge/SpawnProcess.py
+++ b/lib/_emerge/SpawnProcess.py
@@ -20,6 +20,7 @@ from portage.localization import _
from portage.output import EOutput
from portage.util import writemsg_level
from portage.util._async.PipeLogger import PipeLogger
+from portage.util.futures import asyncio
from portage.util.futures.compat_coroutine import coroutine
class SpawnProcess(SubProcess):
@@ -36,7 +37,7 @@ class SpawnProcess(SubProcess):
"unshare_ipc", "unshare_mount", "unshare_pid", "unshare_net")
__slots__ = ("args",) + \
- _spawn_kwarg_names + ("_pipe_logger", "_selinux_type",)
+ _spawn_kwarg_names + ("_main_task", "_selinux_type",)
# Max number of attempts to kill the processes listed in cgroup.procs,
# given that processes may fork before they can be killed.
@@ -141,13 +142,28 @@ class SpawnProcess(SubProcess):
fcntl.fcntl(stdout_fd,
fcntl.F_GETFD) | fcntl.FD_CLOEXEC)
- self._pipe_logger = PipeLogger(background=self.background,
+ pipe_logger = PipeLogger(background=self.background,
scheduler=self.scheduler, input_fd=master_fd,
log_file_path=log_file_path,
stdout_fd=stdout_fd)
- self._pipe_logger.addExitListener(self._pipe_logger_exit)
self._registered = True
- yield self._pipe_logger.async_start()
+ yield pipe_logger.async_start()
+
+ self._main_task = asyncio.ensure_future(
+ self._main(pipe_logger), loop=self.scheduler)
+ self._main_task.add_done_callback(self._main_exit)
+
+ @coroutine
+ def _main(self, pipe_logger):
+ if pipe_logger.poll() is None:
+ yield pipe_logger.async_wait()
+
+ def _main_exit(self, main_task):
+ try:
+ main_task.result()
+ except asyncio.CancelledError:
+ self.cancel()
+ self._async_waitpid()
def _can_log(self, slave_fd):
return True
@@ -171,21 +187,16 @@ class SpawnProcess(SubProcess):
return spawn_func(args, **kwargs)
- def _pipe_logger_exit(self, pipe_logger):
- self._pipe_logger = None
- self._async_waitpid()
-
def _unregister(self):
SubProcess._unregister(self)
if self.cgroup is not None:
self._cgroup_cleanup()
self.cgroup = None
- if self._pipe_logger is not None:
- self._pipe_logger.cancel()
- self._pipe_logger = None
def _cancel(self):
SubProcess._cancel(self)
+ if self._main_task is not None:
+ self._main_task.cancel()
self._cgroup_cleanup()
def _cgroup_cleanup(self):