From 2ee4a8d6b1c7c00cf3c9b748d149a20105d76c08 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 3 Sep 2023 11:29:40 -0500 Subject: [PATCH 1/3] feat: speed up adding and removing RecordUpdateListeners --- src/zeroconf/_core.py | 2 +- src/zeroconf/_handlers/record_manager.pxd | 7 ++++++- src/zeroconf/_handlers/record_manager.py | 4 ++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/zeroconf/_core.py b/src/zeroconf/_core.py index 0264f72ab..403754846 100644 --- a/src/zeroconf/_core.py +++ b/src/zeroconf/_core.py @@ -240,7 +240,7 @@ async def async_wait_for_start(self) -> None: raise NotRunningException @property - def listeners(self) -> List[RecordUpdateListener]: + def listeners(self) -> Set[RecordUpdateListener]: return self.record_manager.listeners async def async_wait(self, timeout: float) -> None: diff --git a/src/zeroconf/_handlers/record_manager.pxd b/src/zeroconf/_handlers/record_manager.pxd index 7a55e64fa..68512e1b2 100644 --- a/src/zeroconf/_handlers/record_manager.pxd +++ b/src/zeroconf/_handlers/record_manager.pxd @@ -11,12 +11,13 @@ cdef object _ADDRESS_RECORD_TYPES cdef object RecordUpdate cdef object TYPE_CHECKING cdef object _TYPE_PTR +cdef object RecordUpdateListener cdef class RecordManager: cdef public object zc cdef public DNSCache cache - cdef public cython.list listeners + cdef public cython.set listeners cpdef async_updates(self, object now, object records) @@ -29,3 +30,7 @@ cdef class RecordManager: now_float=cython.float ) cpdef async_updates_from_response(self, DNSIncoming msg) + + cpdef async_add_listener(self, object listener, object question) + + cpdef async_remove_listener(self, object listener) diff --git a/src/zeroconf/_handlers/record_manager.py b/src/zeroconf/_handlers/record_manager.py index 5e4f7c9b3..d06ec67bb 100644 --- a/src/zeroconf/_handlers/record_manager.py +++ b/src/zeroconf/_handlers/record_manager.py @@ -45,7 +45,7 @@ def __init__(self, zeroconf: 'Zeroconf') -> None: """Init the record manager.""" self.zc = zeroconf self.cache = zeroconf.cache - self.listeners: List[RecordUpdateListener] = [] + self.listeners: Set[RecordUpdateListener] = set() def async_updates(self, now: _float, records: List[RecordUpdate]) -> None: """Used to notify listeners of new information that has updated @@ -174,7 +174,7 @@ def async_add_listener( " In the future this will fail" ) - self.listeners.append(listener) + self.listeners.add(listener) if question is None: return From d65d94610dd65924e273ba6edf6ef56325e5fd30 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 3 Sep 2023 11:34:24 -0500 Subject: [PATCH 2/3] feat: speed up adding and removing RecordUpdateListeners --- src/zeroconf/_handlers/record_manager.pxd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zeroconf/_handlers/record_manager.pxd b/src/zeroconf/_handlers/record_manager.pxd index 68512e1b2..e0792d724 100644 --- a/src/zeroconf/_handlers/record_manager.pxd +++ b/src/zeroconf/_handlers/record_manager.pxd @@ -11,7 +11,7 @@ cdef object _ADDRESS_RECORD_TYPES cdef object RecordUpdate cdef object TYPE_CHECKING cdef object _TYPE_PTR -cdef object RecordUpdateListener + cdef class RecordManager: From ec5f544300ceddfb32659567b3920d43af0ed0e7 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 3 Sep 2023 11:48:07 -0500 Subject: [PATCH 3/3] fix: unhashable --- src/zeroconf/_services/info.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/zeroconf/_services/info.py b/src/zeroconf/_services/info.py index 7ca8d29bb..1ffd95700 100644 --- a/src/zeroconf/_services/info.py +++ b/src/zeroconf/_services/info.py @@ -758,10 +758,6 @@ def generate_request_query( question.unicast = True return out - def __eq__(self, other: object) -> bool: - """Tests equality of service name""" - return isinstance(other, ServiceInfo) and other._name == self._name - def __repr__(self) -> str: """String representation""" return '{}({})'.format(