mirror of https://gitee.com/openkylin/qemu.git
python/machine.py: fix _popen access
As always, Optional[T] causes problems with unchecked access. Add a helper that asserts the pipe is present before we attempt to talk with it. Signed-off-by: John Snow <jsnow@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Message-id: 20201006235817.3280413-9-jsnow@redhat.com Signed-off-by: John Snow <jsnow@redhat.com>
This commit is contained in:
parent
be1183e52f
commit
9223fda464
|
@ -131,7 +131,7 @@ def __init__(self, binary, args=None, wrapper=None, name=None,
|
|||
# Runstate
|
||||
self._qemu_log_path = None
|
||||
self._qemu_log_file = None
|
||||
self._popen = None
|
||||
self._popen: Optional['subprocess.Popen[bytes]'] = None
|
||||
self._events = []
|
||||
self._iolog = None
|
||||
self._qmp_set = True # Enable QMP monitor by default.
|
||||
|
@ -244,6 +244,12 @@ def is_running(self):
|
|||
"""Returns true if the VM is running."""
|
||||
return self._popen is not None and self._popen.poll() is None
|
||||
|
||||
@property
|
||||
def _subp(self) -> 'subprocess.Popen[bytes]':
|
||||
if self._popen is None:
|
||||
raise QEMUMachineError('Subprocess pipe not present')
|
||||
return self._popen
|
||||
|
||||
def exitcode(self):
|
||||
"""Returns the exit code if possible, or None."""
|
||||
if self._popen is None:
|
||||
|
@ -254,7 +260,7 @@ def get_pid(self):
|
|||
"""Returns the PID of the running process, or None."""
|
||||
if not self.is_running():
|
||||
return None
|
||||
return self._popen.pid
|
||||
return self._subp.pid
|
||||
|
||||
def _load_io_log(self):
|
||||
if self._qemu_log_path is not None:
|
||||
|
@ -415,8 +421,8 @@ def _hard_shutdown(self) -> None:
|
|||
waiting for the QEMU process to terminate.
|
||||
"""
|
||||
self._early_cleanup()
|
||||
self._popen.kill()
|
||||
self._popen.wait(timeout=60)
|
||||
self._subp.kill()
|
||||
self._subp.wait(timeout=60)
|
||||
|
||||
def _soft_shutdown(self, timeout: Optional[int],
|
||||
has_quit: bool = False) -> None:
|
||||
|
@ -440,7 +446,7 @@ def _soft_shutdown(self, timeout: Optional[int],
|
|||
self._qmp.cmd('quit')
|
||||
|
||||
# May raise subprocess.TimeoutExpired
|
||||
self._popen.wait(timeout=timeout)
|
||||
self._subp.wait(timeout=timeout)
|
||||
|
||||
def _do_shutdown(self, timeout: Optional[int],
|
||||
has_quit: bool = False) -> None:
|
||||
|
|
Loading…
Reference in New Issue