# Copyright 2012-2024 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

import portage
from _emerge.SubProcess import SubProcess


class PopenProcess(SubProcess):
    __slots__ = (
        "pipe_reader",
        "proc",
    )

    def _start(self):
        self._proc = portage.process.Process(self.proc.pid)
        self._registered = True

        if self.pipe_reader is None:
            self.scheduler.call_soon(self._async_waitpid)
        else:
            try:
                self.pipe_reader.scheduler = self.scheduler
            except AttributeError:
                pass
            self.pipe_reader.addExitListener(self._pipe_reader_exit)
            self.pipe_reader.start()

    def _pipe_reader_exit(self, pipe_reader):
        self._async_waitpid()

    def _async_waitpid_cb(self, *args, **kwargs):
        SubProcess._async_waitpid_cb(self, *args, **kwargs)
        if self.proc.returncode is None:
            # Suppress warning messages like this:
            # ResourceWarning: subprocess 1234 is still running
            self.proc.returncode = self.returncode
