From 0e57d798a2f171f804603cb5a3659de08092e74b Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 3 Dec 2023 18:26:29 -1000 Subject: [PATCH] feat: speed up ServiceInterface callbacks with cython methods (#274) --- src/dbus_fast/message_bus.py | 4 ++-- src/dbus_fast/service.pxd | 6 ++++++ src/dbus_fast/service.py | 15 +++++++++++++++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/dbus_fast/message_bus.py b/src/dbus_fast/message_bus.py index 6bb71bac..b13f9bad 100644 --- a/src/dbus_fast/message_bus.py +++ b/src/dbus_fast/message_bus.py @@ -933,7 +933,7 @@ def _find_message_handler( if not interfaces: return None for interface in interfaces: - methods = ServiceInterface._get_methods(interface) + methods = ServiceInterface._c_get_methods(interface) for method in methods: if method.disabled: continue @@ -943,7 +943,7 @@ def _find_message_handler( and msg.member == method.name and msg.signature == method.in_signature ): - return ServiceInterface._get_handler(interface, method, self) + return ServiceInterface._c_get_handler(interface, method, self) return None diff --git a/src/dbus_fast/service.pxd b/src/dbus_fast/service.pxd index e5457d0d..8cf1adc9 100644 --- a/src/dbus_fast/service.pxd +++ b/src/dbus_fast/service.pxd @@ -24,3 +24,9 @@ cdef class ServiceInterface: cdef list __signals cdef set __buses cdef dict __handlers + + @staticmethod + cdef list _c_get_methods(ServiceInterface interface) + + @staticmethod + cdef object _c_get_handler(ServiceInterface interface, _Method method, object bus) diff --git a/src/dbus_fast/service.py b/src/dbus_fast/service.py index ebfb9a19..70281904 100644 --- a/src/dbus_fast/service.py +++ b/src/dbus_fast/service.py @@ -455,6 +455,13 @@ def _get_properties(interface: "ServiceInterface") -> List[_Property]: def _get_methods(interface: "ServiceInterface") -> List[_Method]: return interface.__methods + @staticmethod + def _c_get_methods(interface: "ServiceInterface") -> List[_Method]: + # _c_get_methods is used by the C code to get the methods for an + # interface + # https://github.com/cython/cython/issues/3327 + return interface.__methods + @staticmethod def _get_signals(interface: "ServiceInterface") -> List[_Signal]: return interface.__signals @@ -469,6 +476,14 @@ def _get_handler( ) -> Callable[[Message, Callable[[Message], None]], None]: return interface.__handlers[bus][method] + @staticmethod + def _c_get_handler( + interface: "ServiceInterface", method: _Method, bus: "BaseMessageBus" + ) -> Callable[[Message, Callable[[Message], None]], None]: + # _c_get_handler is used by the C code to get the handler for a method + # https://github.com/cython/cython/issues/3327 + return interface.__handlers[bus][method] + @staticmethod def _add_bus( interface: "ServiceInterface",