From 26c3ac0afbf00cc66f6e7958a18e8800b056e2d9 Mon Sep 17 00:00:00 2001 From: Sven Sager Date: Sat, 19 Apr 2025 15:55:49 +0200 Subject: [PATCH] refactor(dbus): D-Bus interface management with cleanup support. Introduced a `DbusInterface` base class with a `cleanup` method to standardize resource cleanup for D-Bus interfaces. Modified `InterfacePiControl` to inherit from it and implemented `cleanup` logic for proper watchdog resource handling. Adjusted `BusProvider` to manage multiple interfaces and ensure cleanup on shutdown. --- .../dbus_middleware1/bus_provider.py | 17 ++++++++++++++++- .../dbus_middleware1/dbus_helper.py | 12 ++++++++++++ .../process_image/interface_picontrol.py | 6 +++++- 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/revpi_middleware/dbus_middleware1/bus_provider.py b/src/revpi_middleware/dbus_middleware1/bus_provider.py index bc45d4a..6f91bce 100644 --- a/src/revpi_middleware/dbus_middleware1/bus_provider.py +++ b/src/revpi_middleware/dbus_middleware1/bus_provider.py @@ -34,10 +34,19 @@ class BusProvider(Thread): def run(self): log.debug("enter BusProvider.run") + # The 2nd, 3rd, ... arguments can be objects or tuples of a path and an object + # Example(), + # ("Subdir1", Example()), + # ("Subdir2", Example()), + # ("Subdir2/Whatever", Example()) + lst_interfaces = [ + InterfacePiControl(self.picontrol_device, self.config_rsc), + ] + try: self._bus.publish( REVPI_DBUS_NAME, - InterfacePiControl(self.picontrol_device, self.config_rsc), + *lst_interfaces, ) except Exception as e: log.error(f"can not publish dbus {REVPI_DBUS_NAME}: {e}") @@ -47,6 +56,12 @@ class BusProvider(Thread): except Exception as e: log.error(f"can not run dbus mainloop: {e}") + # Clean up all interfaces + for interface in lst_interfaces: + if type(interface) is tuple: + _, interface = interface + interface.cleanup() + log.debug("leave BusProvider.run") def stop(self): diff --git a/src/revpi_middleware/dbus_middleware1/dbus_helper.py b/src/revpi_middleware/dbus_middleware1/dbus_helper.py index bec4697..23bcd2e 100644 --- a/src/revpi_middleware/dbus_middleware1/dbus_helper.py +++ b/src/revpi_middleware/dbus_middleware1/dbus_helper.py @@ -11,6 +11,18 @@ REVPI_DBUS_NAME = "com.revolutionpi.middleware1" REVPI_DBUS_BASE_PATH = "/com/revolutionpi/middleware1" +class DbusInterface: + + def cleanup(self): + """ + Represents a method responsible for performing cleanup operations. This method is executed to properly + release resources, close connections, or perform other necessary finalization tasks. + + This method does not take any arguments or return a value. + """ + pass + + def extend_interface(*args) -> str: """ Extends an interface name by appending additional segments to a pre-defined base name. diff --git a/src/revpi_middleware/dbus_middleware1/process_image/interface_picontrol.py b/src/revpi_middleware/dbus_middleware1/process_image/interface_picontrol.py index 34623af..f62a972 100644 --- a/src/revpi_middleware/dbus_middleware1/process_image/interface_picontrol.py +++ b/src/revpi_middleware/dbus_middleware1/process_image/interface_picontrol.py @@ -7,11 +7,12 @@ from logging import getLogger from pydbus.generic import signal from .process_image_helper import PiControlIoctl, ResetDriverWatchdog +from ..dbus_helper import DbusInterface log = getLogger(__name__) -class InterfacePiControl: +class InterfacePiControl(DbusInterface): """ @@ -32,6 +33,9 @@ class InterfacePiControl: self.wd_reset_driver = ResetDriverWatchdog(self.picontrol_device) self.wd_reset_driver.register_call(self.notify_reset_driver) + def cleanup(self): + self.wd_reset_driver.stop() + def notify_reset_driver(self): self.NotifyDriverReset()