weakref'd signal receivers may cause deadlock when gc'd
|Reported by:||Owned by:|
|Has patch:||no||Needs documentation:||no|
|Needs tests:||no||Patch needs improvement:||no|
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.