summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorJuho Hautala <juho.hautala@iki.fi>2026-02-22 19:16:34 -0800
committerJacob Walls <jacobtylerwalls@gmail.com>2026-03-17 17:08:18 -0400
commitba4751e0ca558dd8f0d9e6153bec4280289ca2f4 (patch)
tree70d82804ae12344179731b15fbf29ea2e4d846e1 /django
parent37284896f08e120505c8c01918b9d6bba03c2204 (diff)
Fixed #36939 -- Avoided weakref.finalize in Signal.connect().
Replaced weak receiver registration in Signal.connect() to pass _flag_dead_receivers directly as the callback for weakref.ref() and weakref.WeakMethod() instead of creating weakref.finalize() objects. This prevented finalizer accumulation in repeated weak connect()/disconnect() cycles where receivers remain alive.
Diffstat (limited to 'django')
-rw-r--r--django/dispatch/dispatcher.py5
1 files changed, 1 insertions, 4 deletions
diff --git a/django/dispatch/dispatcher.py b/django/dispatch/dispatcher.py
index d4a6eff2bc..aef6a942b1 100644
--- a/django/dispatch/dispatcher.py
+++ b/django/dispatch/dispatcher.py
@@ -154,13 +154,10 @@ class Signal:
if weak:
ref = weakref.ref
- receiver_object = receiver
# Check for bound methods
if hasattr(receiver, "__self__") and hasattr(receiver, "__func__"):
ref = weakref.WeakMethod
- receiver_object = receiver.__self__
- receiver = ref(receiver)
- weakref.finalize(receiver_object, self._flag_dead_receivers)
+ receiver = ref(receiver, self._flag_dead_receivers)
# Keep a weakref to sender if possible to ensure associated receivers
# are cleared if it gets garbage collected. This ensures there is no