Opened 12 years ago
Closed 11 years ago
#19947 closed Bug (duplicate)
weakref'd signal receivers may cause deadlock when gc'd
Reported by: | Owned by: | ||
---|---|---|---|
Component: | Core (Other) | Version: | 1.5 |
Severity: | Normal | Keywords: | |
Cc: | Triage Stage: | Accepted | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
By default when a receiver is connected to a Signal it is wrapped in a saferef has a call back to Signal._remove_reciever when gc'd.
Inside, _remove_receiver it acquires a lock on itself before proceeding to delete the reference of the receiver from the signal.
To find the receiver, the receiver list is reversed. This generates a new listreverseiterator to be created. In turn, this can may cause a GC to run. Which clears all unreachable weakrefs, one of which may be another receiver connected to the same signal. The gc calls the callback on this receiver (_remove_receiver) and hits a deadlock on trying to acquire the Lock again.
Change History (5)
comment:1 by , 12 years ago
Triage Stage: | Unreviewed → Accepted |
---|
comment:2 by , 12 years ago
Owner: | changed from | to
---|---|
Status: | new → assigned |
comment:3 by , 11 years ago
I've been trying to come up with some code to reliable reproduce this, so far I've been unsuccessful. I will continue to try though.
comment:4 by , 11 years ago
Owner: | removed |
---|---|
Status: | assigned → new |
comment:5 by , 11 years ago
Resolution: | → duplicate |
---|---|
Status: | new → closed |
I am marking this as duplicate of #21952, that ticket contains a patch for this issue.
Do you have some code that can reproduce this?