-
-
Notifications
You must be signed in to change notification settings - Fork 677
Description
In #11521 trac_11521_callback.patch a callback was installed on a weakref value of a TripleDict:
_cache[key] = KeyedRef(H, _cache.eraser, (id(X),id(Y),id(category)))
That's not safe: If the value under that key gets changed while the value remains in memory, the callback will be executed and remove an entry that now has an unrelated value!
So: Either prove that the value under this key will not change for the lifetime of H (keep in mind that cyclic references can extend the lifetime of an otherwise unreachable object essentially indefinitely, so the proof needs to include that all key components survive H, otherwise those ids could get reused) or provide a more selective callback (for instance, ensure that the value is still as expected before deleting).
Note: The patch trac_14159_safer_callback.patch follows the second approach, so that a memory leak remains fixed.
Another point is that the API of _cache.eraser isn't really published, so this behaviour is probably better encapsulated in a method on the dict itself.
See #12313 comment 317 for a situation that likely implicates these callbacks (someone has to hold strong references to these keys in order to set the dict, so the absence of the keys suggests a spurious execution of this kind of callback)
Apply
Depends on #13387
Depends on #14254
Component: memleak
Author: Simon King
Reviewer: Nils Bruin
Merged: sage-5.10.beta0
Issue created by migration from https://trac.sagemath.org/ticket/14159