Allow creating WeakRefs outside the main Ractor - #88
Conversation
| else | ||
| @@__map[self] = orig | ||
| @weak = true | ||
| @store = ::ObjectSpace::WeakMap.new |
There was a problem hiding this comment.
This very significantly increase memory usage, because now every WeakRef has its own WeakMap instance (208B for one entry).
There was a problem hiding this comment.
Could keep one WeakRef per Ractor, as #2 does, but only if there was a mechanism to also move/copy the referenced object if necessary. This would be possible to implement but would significantly increase the complexity.
Alternatively, we could follow #2, but would need to somehow prevent WeakRefs from being moved.
There was a problem hiding this comment.
I mean, what I would really want is a ractor-shareable, mutable WeakMap, but I guess the constraints around non-shareable values could not be resolved.
Or alternatively, a way to mutate an object before and after it has been sent over a port. That way it could hold on to the referenced object for transit.
Both of these are obviously out of scope for this PR.
There was a problem hiding this comment.
What's unfortunate is that since a couple versions, thanks to @peterzhu2118 we have actual weak references in the GC, and WeakRef could be implemented without needing a WeakMap (I think Peter had a prototype).
But since it's all private API and weakref is a gem, it can't use those facilities.
My preferred solution (but not the easiest) would be to request weakref to be made core, so that it can become a real weakref.
It was extracted as a gem because that was the direction to turn the stdlib into gems for easier maintenance, but given it's barely 40 lines of codes, I'd think this is a bit of an overshoot.
There was a problem hiding this comment.
Oh I agree, that would be a proper solution.
Fix for https://bugs.ruby-lang.org/issues/22105
WeakRef instance can move between Ractors (also moving the object they reference if it isn't shareable).
They cannot be made shareable, as
ObjectSpace::WeakMapcannot be made shareable.