On Wed, Jul 09, 2025 at 08:22:16PM +0200, Benno Lossin wrote: > On Wed Jul 9, 2025 at 12:34 PM CEST, Andreas Hindborg wrote: > > "Benno Lossin" <lossin@xxxxxxxxxx> writes: > >> On Tue Jul 8, 2025 at 10:54 AM CEST, Andreas Hindborg wrote: > >>> "Boqun Feng" <boqun.feng@xxxxxxxxx> 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 <a.hindborg@xxxxxxxxxx> 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 <a.hindborg@xxxxxxxxxx> > >>>>> > >>>>> LGTM: > >>>>> Reviewed-by: Alice Ryhl <aliceryhl@xxxxxxxxxx> > >>>>> > >>>>> > +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 { } > > > > Ok, now I got it. You are saying I don't need to use the atomic load > > method, because I have mutable access. Sounds good. > > > > But I guess a relaxed load and access through a mutable reference should > > result in the same code generation on most (all?) platforms? > > AFAIK it is not the same on arm. > Right, when LTO=y, arm64 use acquire load to implement READ_ONCE()/atomic_read(). Regards, Boqun > --- > Cheers, > Benno >