One of the prerequisites to doing reference counting is to have a mutable piece of data inside an immutable piece of data.
A few years ago, Timon Gehr implemented a concept for __mutable that looked like it might be the answer. But there was a large problem. As the title suggests, it's because immutable is implicitly sharable.
This makes sense in a world of fully transitive immutable, where if you have an immutable pointer, nothing in it can ever change. But if you have a __mutable island, that can change. So the answer at the time was, immutable(__mutable) -> shared.
Unfortunately, this means you have to apply it to const as well, because const could be pointing to immutable. I'll note that this still might be a valuable concept, just slightly annoying, especially with shared becoming more tightly controlled.
I thought of an idea -- maybe you make it so if a type T had a __mutable piece, you can't share an immutable(T). This actually works quite well, and now you have to explicitly have shared(immutable(T)) in order to share it.
But there is a rather large problem -- classes. Classes might have a __mutable buried in a derived object that the compiler isn't aware of. So that is a no-go.
Another possibility is to introduce new type qualifiers, like immutable-with-mutable or const-with-mutable, which are not shared, but I feel like the appetite for new qualifiers is pretty low, and the names...
I've come to the conclusion, in order to fix this situation, so __mutable really means mutable and shared is an orthogonal piece, you need to remove the implicit sharing of immutable. While it can make sense, the conflation of the two concepts causes impossible-to-fix issues. Not just mutable, things like thread-local garbage collection might be easier if you have to explicitly share things.
-Steve
Permalink
Reply