From 9edc2b03624674917c473365f3d5c0671fe04370 Mon Sep 17 00:00:00 2001 From: Christian Kellner Date: Wed, 22 Jul 2020 15:39:34 +0200 Subject: [PATCH] remoteloop: port LoopServer to use BaseAPI Now that `api.BaseAPI` provides the basic scaffolding for API servers, use that base class and remove the code duplication. --- osbuild/remoteloop.py | 29 ++++------------------------- 1 file changed, 4 insertions(+), 25 deletions(-) diff --git a/osbuild/remoteloop.py b/osbuild/remoteloop.py index 75b0eea9..742cb25b 100644 --- a/osbuild/remoteloop.py +++ b/osbuild/remoteloop.py @@ -1,19 +1,17 @@ -import asyncio import contextlib import errno import os -import threading +from . import api from . import loop from .util import jsoncomm - __all__ = [ "LoopClient", "LoopServer" ] -class LoopServer: +class LoopServer(api.BaseAPI): """Server for creating loopback devices The server listens for requests on a AF_UNIX/SOCK_DRGAM sockets. @@ -38,12 +36,9 @@ class LoopServer: """ def __init__(self, socket_address): - self.socket_address = socket_address + super().__init__(socket_address) self.devs = [] self.ctl = loop.LoopControl() - self.event_loop = asyncio.new_event_loop() - self.thread = threading.Thread(target=self._run_event_loop) - self.barrier = threading.Barrier(2) def _create_device(self, fd, dir_fd, offset=None, sizelimit=None): while True: @@ -85,23 +80,7 @@ class LoopServer: server.send({"devname": devname}, destination=addr) fds.close() - def _run_event_loop(self): - with jsoncomm.Socket.new_server(self.socket_address) as server: - self.barrier.wait() - self.event_loop.add_reader(server, self._dispatch, server) - asyncio.set_event_loop(self.event_loop) - self.event_loop.run_forever() - self.event_loop.remove_reader(server) - - def __enter__(self): - self.thread.start() - self.barrier.wait() - return self - - def __exit__(self, *args): - self.event_loop.call_soon_threadsafe(self.event_loop.stop) - self.thread.join() - self.event_loop.close() + def _cleanup(self): for lo in self.devs: lo.close()