Re: [PATCH v11 1/4] rust: types: Add Ownable/Owned types

From: Benno Lossin
Date: Mon Aug 18 2025 - 18:29:07 EST


On Mon Aug 18, 2025 at 3:04 PM CEST, Oliver Mangold wrote:
> On 250818 1446, Andreas Hindborg wrote:
>> "Oliver Mangold" <oliver.mangold@xxxxx> writes:
>> > +impl<T: OwnableMut> DerefMut for Owned<T> {
>> > + fn deref_mut(&mut self) -> &mut Self::Target {
>> > + // SAFETY: The type invariants guarantee that the object is valid, and that we can safely
>> > + // return a mutable reference to it.
>> > + unsafe { self.ptr.as_mut() }
>> > + }
>> > +}
>>
>> I think someone mentioned this before, but handing out mutable
>> references can be a problem if `T: !Unpin`. For instance, we don't want
>> to hand out `&mut Page` in case of `Owned<Page>`.
>>
>
> That was the reason, why `OwnableMut` was introduced in the first place.
> It's clear, I guess, that as-is it cannot be implemented on many classes.

Yeah the safety requirements ensure that you can't implement it on
`!Unpin` types.

But I'm not sure it's useful then? As you said there aren't many types
that will implement the type then, so how about we change the meaning
and make it give out a pinned mutable reference instead?

> Good question, I have been thinking about it, too. But it might
> be, that it isn't needed at all. As I understand, usually Rust wrappers
> are around non-movable C structs. Do we actually have a useful application
> for OwnableMut?

Also, do we even need two different traits? Which types would only
implement `Ownable` but not `OwnableMut`?

---
Cheers,
Benno