"Boqun Feng" <[email protected]> writes:

> On Mon, Jul 07, 2025 at 03:38:58PM +0200, Alice Ryhl wrote:
>> On Mon, Jul 7, 2025 at 3:32 PM Andreas Hindborg <[email protected]> 
>> wrote:
>> >
>> > Introduce the `SetOnce` type, a container that can only be written once.
>> > The container uses an internal atomic to synchronize writes to the internal
>> > value.
>> >
>> > Signed-off-by: Andreas Hindborg <[email protected]>
>>
>> LGTM:
>> Reviewed-by: Alice Ryhl <[email protected]>
>>
>> > +impl<T> Drop for SetOnce<T> {
>> > +    fn drop(&mut self) {
>> > +        if self.init.load(Acquire) == 2 {
>> > +            // SAFETY: By the type invariants of `Self`, `self.init == 2` 
>> > means that `self.value`
>> > +            // contains a valid value. We have exclusive access, as we 
>> > hold a `mut` reference to
>> > +            // `self`.
>> > +            unsafe { drop_in_place(self.value.get()) };
>>
>> This load does not need to be Acquire. It can be a Relaxed load or
>> even an unsynchronized one since the access is exclusive.
>
> Right, I think we can do the similar as Revocable here:
>
>         if *self.init.get_mut() == 2 { }
>
> Further, with my following Benno's suggestion and making `Atomic<T>` an
> `UnsafeCell<T>:
>
>       https://lore.kernel.org/rust-for-linux/[email protected]/
>
> compiler can generate a noalias reference here, which allows further
> optimization.
>

You would like to remove `PhantomPinned` to enable noalias? I guess that
makes sense in this case. I'll fix that for next spin.


Best regards,
Andreas Hindborg



Reply via email to