@@ -105,9 +105,7 @@ impl OnceNonZeroUsize {
105
105
/// full.
106
106
#[ inline]
107
107
pub fn set ( & self , value : NonZeroUsize ) -> Result < ( ) , ( ) > {
108
- let exchange =
109
- self . inner . compare_exchange ( 0 , value. get ( ) , Ordering :: Release , Ordering :: Acquire ) ;
110
- match exchange {
108
+ match self . compare_exchange ( value) {
111
109
Ok ( _) => Ok ( ( ) ) ,
112
110
Err ( _) => Err ( ( ) ) ,
113
111
}
@@ -141,8 +139,7 @@ impl OnceNonZeroUsize {
141
139
where
142
140
F : FnOnce ( ) -> Result < NonZeroUsize , E > ,
143
141
{
144
- let val = self . inner . load ( Ordering :: Acquire ) ;
145
- match NonZeroUsize :: new ( val) {
142
+ match self . get ( ) {
146
143
Some ( it) => Ok ( it) ,
147
144
None => self . init ( f) ,
148
145
}
@@ -151,13 +148,18 @@ impl OnceNonZeroUsize {
151
148
#[ cold]
152
149
#[ inline( never) ]
153
150
fn init < E > ( & self , f : impl FnOnce ( ) -> Result < NonZeroUsize , E > ) -> Result < NonZeroUsize , E > {
154
- let mut val = f ( ) ?. get ( ) ;
155
- let exchange = self . inner . compare_exchange ( 0 , val , Ordering :: Release , Ordering :: Acquire ) ;
156
- if let Err ( old) = exchange {
151
+ let nz = f ( ) ?;
152
+ let mut val = nz . get ( ) ;
153
+ if let Err ( old) = self . compare_exchange ( nz ) {
157
154
val = old;
158
155
}
159
156
Ok ( unsafe { NonZeroUsize :: new_unchecked ( val) } )
160
157
}
158
+
159
+ #[ inline( always) ]
160
+ fn compare_exchange ( & self , val : NonZeroUsize ) -> Result < usize , usize > {
161
+ self . inner . compare_exchange ( 0 , val. get ( ) , Ordering :: Release , Ordering :: Acquire )
162
+ }
161
163
}
162
164
163
165
/// A thread-safe cell which can be written to only once.
0 commit comments