python/aqmp: add __del__ method to legacy interface
asyncio can complain *very* loudly if you forget to back out of things gracefully before the garbage collector starts destroying objects that contain live references to asyncio Tasks. The usual fix is just to remember to call aqmp.disconnect(), but for the sake of the legacy wrapper and quick, one-off scripts where a graceful shutdown is not necessarily of paramount imporance, add a courtesy cleanup that will trigger prior to seeing screenfuls of confusing asyncio tracebacks. Note that we can't *always* save you from yourself; depending on when the GC runs, you might just seriously be out of luck. The best we can do in this case is to gently remind you to clean up after yourself. (Still much better than multiple pages of incomprehensible python warnings for the crime of forgetting to put your toys away.) Signed-off-by: John Snow <jsnow@redhat.com> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> Reviewed-by: Beraldo Leal <bleal@redhat.com>
This commit is contained in:
parent
dc6877bd2e
commit
3bc72e3aed
@ -16,6 +16,8 @@ from typing import (
|
|||||||
import qemu.qmp
|
import qemu.qmp
|
||||||
from qemu.qmp import QMPMessage, QMPReturnValue, SocketAddrT
|
from qemu.qmp import QMPMessage, QMPReturnValue, SocketAddrT
|
||||||
|
|
||||||
|
from .error import AQMPError
|
||||||
|
from .protocol import Runstate
|
||||||
from .qmp_client import QMPClient
|
from .qmp_client import QMPClient
|
||||||
|
|
||||||
|
|
||||||
@ -136,3 +138,19 @@ class QEMUMonitorProtocol(qemu.qmp.QEMUMonitorProtocol):
|
|||||||
|
|
||||||
def send_fd_scm(self, fd: int) -> None:
|
def send_fd_scm(self, fd: int) -> None:
|
||||||
self._aqmp.send_fd_scm(fd)
|
self._aqmp.send_fd_scm(fd)
|
||||||
|
|
||||||
|
def __del__(self) -> None:
|
||||||
|
if self._aqmp.runstate == Runstate.IDLE:
|
||||||
|
return
|
||||||
|
|
||||||
|
if not self._aloop.is_running():
|
||||||
|
self.close()
|
||||||
|
else:
|
||||||
|
# Garbage collection ran while the event loop was running.
|
||||||
|
# Nothing we can do about it now, but if we don't raise our
|
||||||
|
# own error, the user will be treated to a lot of traceback
|
||||||
|
# they might not understand.
|
||||||
|
raise AQMPError(
|
||||||
|
"QEMUMonitorProtocol.close()"
|
||||||
|
" was not called before object was garbage collected"
|
||||||
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user