Skip to content

Commit bd4c0ef

Browse files
elmarcojnsnow
authored andcommitted
python/qemu/machine: use socketpair() for QMP by default
When no monitor address is given, establish the QMP communication through a socketpair() (API is also supported on Windows since Python 3.5) Signed-off-by: Marc-André Lureau <[email protected]> Reviewed-by: Daniel P. Berrangé <[email protected]> Message-id: [email protected] [Resolved conflicts, fixed typing error. --js] Signed-off-by: John Snow <[email protected]>
1 parent 603a3ba commit bd4c0ef

File tree

1 file changed

+17
-8
lines changed

1 file changed

+17
-8
lines changed

python/qemu/machine/machine.py

+17-8
Original file line numberDiff line numberDiff line change
@@ -158,17 +158,13 @@ def __init__(self,
158158
self._qmp_timer = qmp_timer
159159

160160
self._name = name or f"{id(self):x}"
161+
self._sock_pair: Optional[Tuple[socket.socket, socket.socket]] = None
161162
self._temp_dir: Optional[str] = None
162163
self._base_temp_dir = base_temp_dir
163164
self._sock_dir = sock_dir
164165
self._log_dir = log_dir
165166

166-
if monitor_address is not None:
167-
self._monitor_address = monitor_address
168-
else:
169-
self._monitor_address = os.path.join(
170-
self.sock_dir, f"{self._name}.qmp"
171-
)
167+
self._monitor_address = monitor_address
172168

173169
self._console_log_path = console_log
174170
if self._console_log_path:
@@ -303,7 +299,11 @@ def _base_args(self) -> List[str]:
303299
args = ['-display', 'none', '-vga', 'none']
304300

305301
if self._qmp_set:
306-
if isinstance(self._monitor_address, tuple):
302+
if self._sock_pair:
303+
fd = self._sock_pair[0].fileno()
304+
os.set_inheritable(fd, True)
305+
moncdev = f"socket,id=mon,fd={fd}"
306+
elif isinstance(self._monitor_address, tuple):
307307
moncdev = "socket,id=mon,host={},port={}".format(
308308
*self._monitor_address
309309
)
@@ -337,10 +337,17 @@ def _pre_launch(self) -> None:
337337
self._remove_files.append(self._console_address)
338338

339339
if self._qmp_set:
340+
monitor_address = None
341+
sock = None
342+
if self._monitor_address is None:
343+
self._sock_pair = socket.socketpair()
344+
sock = self._sock_pair[1]
340345
if isinstance(self._monitor_address, str):
341346
self._remove_files.append(self._monitor_address)
347+
monitor_address = self._monitor_address
342348
self._qmp_connection = QEMUMonitorProtocol(
343-
self._monitor_address,
349+
address=monitor_address,
350+
sock=sock,
344351
server=True,
345352
nickname=self._name
346353
)
@@ -360,6 +367,8 @@ def _pre_launch(self) -> None:
360367
))
361368

362369
def _post_launch(self) -> None:
370+
if self._sock_pair:
371+
self._sock_pair[0].close()
363372
if self._qmp_connection:
364373
self._qmp.accept(self._qmp_timer)
365374

0 commit comments

Comments
 (0)