From 8f39ba3ada1dfdec8d7230c77e52ef802e91b23d Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 11 Sep 2023 18:50:05 -0500 Subject: [PATCH] feat: speed up connect and disconnect (#247) --- build_ext.py | 1 + src/dbus_fast/_private/address.pxd | 15 +++++++++++++++ src/dbus_fast/_private/address.py | 4 +++- src/dbus_fast/message.pxd | 2 +- src/dbus_fast/message_bus.pxd | 10 +++++++--- src/dbus_fast/message_bus.py | 8 ++++++-- 6 files changed, 33 insertions(+), 7 deletions(-) create mode 100644 src/dbus_fast/_private/address.pxd diff --git a/build_ext.py b/build_ext.py index 5eaf0a3..df80aa3 100644 --- a/build_ext.py +++ b/build_ext.py @@ -28,6 +28,7 @@ def build(setup_kwargs): "src/dbus_fast/service.py", "src/dbus_fast/signature.py", "src/dbus_fast/unpack.py", + "src/dbus_fast/_private/address.py", "src/dbus_fast/_private/marshaller.py", "src/dbus_fast/_private/unmarshaller.py", ], diff --git a/src/dbus_fast/_private/address.pxd b/src/dbus_fast/_private/address.pxd new file mode 100644 index 0000000..ddec3b5 --- /dev/null +++ b/src/dbus_fast/_private/address.pxd @@ -0,0 +1,15 @@ +"""cdefs for address.py""" + +import cython + + +cdef object unquote + +@cython.locals(kv=cython.str, opt_string=cython.str, address=cython.str) +cpdef parse_address(cython.str address_str) + +cpdef get_bus_address(object bus_type) + +cpdef get_session_bus_address() + +cpdef get_system_bus_address() diff --git a/src/dbus_fast/_private/address.py b/src/dbus_fast/_private/address.py index f6322c1..9201e0f 100644 --- a/src/dbus_fast/_private/address.py +++ b/src/dbus_fast/_private/address.py @@ -8,8 +8,10 @@ from ..errors import InvalidAddressError invalid_address_chars_re = re.compile(r"[^-0-9A-Za-z_/.%]") +str_ = str -def parse_address(address_str: str) -> List[Tuple[str, Dict[str, str]]]: + +def parse_address(address_str: str_) -> List[Tuple[str, Dict[str, str]]]: """Parse a dbus address string into a list of addresses.""" addresses: List[Tuple[str, Dict[str, str]]] = [] diff --git a/src/dbus_fast/message.pxd b/src/dbus_fast/message.pxd index 12aa0a4..891c8ce 100644 --- a/src/dbus_fast/message.pxd +++ b/src/dbus_fast/message.pxd @@ -43,7 +43,7 @@ cdef class Message: cdef public object error_name cdef public object reply_serial cdef public object sender - cdef public object unix_fds + cdef public cython.list unix_fds cdef public object signature cdef public object signature_tree cdef public object body diff --git a/src/dbus_fast/message_bus.pxd b/src/dbus_fast/message_bus.pxd index 137971b..2114e6f 100644 --- a/src/dbus_fast/message_bus.pxd +++ b/src/dbus_fast/message_bus.pxd @@ -1,5 +1,6 @@ import cython +from ._private.address cimport get_bus_address, parse_address from .message cimport Message from .service cimport ServiceInterface, _Method @@ -10,18 +11,19 @@ cdef object MessageFlag cdef object MESSAGE_TYPE_CALL cdef object MESSAGE_TYPE_SIGNAL -cdef object NO_REPLY_EXPECTED_VALUE +cdef cython.uint NO_REPLY_EXPECTED_VALUE cdef object BLOCK_UNEXPECTED_REPLY cdef object assert_object_path_valid cdef object assert_bus_name_valid -cdef _expects_reply(Message msg) +@cython.locals(flag_value=cython.uint) +cdef bint _expects_reply(Message msg) cdef class BaseMessageBus: cdef public object unique_name - cdef public object _disconnected + cdef public bint _disconnected cdef public object _user_disconnect cdef public cython.dict _method_return_handlers cdef public object _serial @@ -48,3 +50,5 @@ cdef class BaseMessageBus: interfaces=cython.list, ) cdef _find_message_handler(self, Message msg) + + cdef _setup_socket(self) diff --git a/src/dbus_fast/message_bus.py b/src/dbus_fast/message_bus.py index 5761524..8dd00c0 100644 --- a/src/dbus_fast/message_bus.py +++ b/src/dbus_fast/message_bus.py @@ -36,7 +36,8 @@ _Message = Message def _expects_reply(msg: _Message) -> bool: """Whether a message expects a reply.""" - return not (msg.flags.value & NO_REPLY_EXPECTED_VALUE) + flag_value = msg.flags.value + return not (flag_value & NO_REPLY_EXPECTED_VALUE) def _block_unexpected_reply(reply: _Message) -> None: @@ -153,6 +154,9 @@ class BaseMessageBus: # machine id is lazy loaded self._machine_id: Optional[int] = None + self._sock: Optional[socket.socket] = None + self._fd: Optional[int] = None + self._stream: Optional[Any] = None self._setup_socket() @@ -587,7 +591,7 @@ class BaseMessageBus: self._method_return_handlers.clear() - for path in list(self._path_exports.keys()): + for path in list(self._path_exports): self.unexport(path) self._user_message_handlers.clear()