From efe8d646c932ff091106f0c2b6d5fd79a03efdb4 Mon Sep 17 00:00:00 2001 From: jason kirtland Date: Thu, 23 Jul 2015 12:15:29 +0200 Subject: Additional bookkeeping cleanup for non-ANY connections at disconnect time. --- CHANGES | 5 +++++ blinker/base.py | 1 + tests/test_signals.py | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+) diff --git a/CHANGES b/CHANGES index b4c0563..b57f5a3 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,11 @@ Blinker Changelog ================= +Version 1.4dev +-------------- + +- Additional bookkeeping cleanup for non-ANY connections at disconnect + time. Version 1.3 ----------- diff --git a/blinker/base.py b/blinker/base.py index 8fa0390..b6b890b 100644 --- a/blinker/base.py +++ b/blinker/base.py @@ -334,6 +334,7 @@ class Signal(object): self.receivers.pop(receiver_id, None) else: self._by_sender[sender_id].discard(receiver_id) + self._by_receiver[receiver_id].discard(sender_id) def _cleanup_receiver(self, receiver_ref): """Disconnect a receiver from all senders.""" diff --git a/tests/test_signals.py b/tests/test_signals.py index e6142fb..c6076f9 100644 --- a/tests/test_signals.py +++ b/tests/test_signals.py @@ -180,6 +180,38 @@ def test_signal_signals_weak_sender(): assert len(sentinel) == 1 +def test_empty_bucket_growth(): + sentinel = Sentinel() + sig = blinker.Signal() + senders = lambda: (len(sig._by_sender), + sum(len(i) for i in sig._by_sender.values())) + receivers = lambda: (len(sig._by_receiver), + sum(len(i) for i in sig._by_receiver.values())) + + receiver1 = sentinel.make_receiver('receiver1') + receiver2 = sentinel.make_receiver('receiver2') + + class Sender(object): + """A weakref-able object.""" + + sender = Sender() + sig.connect(receiver1, sender=sender) + sig.connect(receiver2, sender=sender) + + assert senders() == (1, 2) + assert receivers() == (2, 2) + + sig.disconnect(receiver1, sender=sender) + + assert senders() == (1, 1) + assert receivers() == (2, 1) + + sig.disconnect(receiver2, sender=sender) + + assert senders() == (1, 0) + assert receivers() == (2, 0) + + def test_meta_connect_failure(): def meta_received(sender, **kw): raise TypeError('boom') -- cgit v1.2.1