Opened 13 years ago
Closed 12 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 , 13 years ago
| Triage Stage: | Unreviewed → Accepted |
|---|
comment:2 by , 12 years ago
| Owner: | changed from to |
|---|---|
| Status: | new → assigned |
comment:3 by , 12 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 , 12 years ago
| Owner: | removed |
|---|---|
| Status: | assigned → new |
comment:5 by , 12 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?