@@ -127,7 +127,7 @@ impl<T> BiLock<T> {
127
127
/// Note that the returned future will never resolve to an error.
128
128
pub fn lock ( self ) -> BiLockAcquire < T > {
129
129
BiLockAcquire {
130
- inner : self ,
130
+ inner : Some ( self ) ,
131
131
}
132
132
}
133
133
@@ -188,23 +188,21 @@ impl<'a, T> Drop for BiLockGuard<'a, T> {
188
188
/// acquired.
189
189
#[ derive( Debug ) ]
190
190
pub struct BiLockAcquire < T > {
191
- inner : BiLock < T > ,
191
+ inner : Option < BiLock < T > > ,
192
192
}
193
193
194
194
impl < T > Future for BiLockAcquire < T > {
195
195
type Item = BiLockAcquired < T > ;
196
196
type Error = ( ) ;
197
197
198
198
fn poll ( & mut self ) -> Poll < BiLockAcquired < T > , ( ) > {
199
- match self . inner . poll_lock ( ) {
199
+ match self . inner . as_ref ( ) . expect ( "cannot poll after Ready" ) . poll_lock ( ) {
200
200
Async :: Ready ( r) => {
201
201
mem:: forget ( r) ;
202
- Ok ( BiLockAcquired {
203
- inner : BiLock { inner : self . inner . inner . clone ( ) } ,
204
- } . into ( ) )
205
202
}
206
- Async :: NotReady => Ok ( Async :: NotReady ) ,
203
+ Async :: NotReady => return Ok ( Async :: NotReady ) ,
207
204
}
205
+ Ok ( Async :: Ready ( BiLockAcquired { inner : self . inner . take ( ) } ) )
208
206
}
209
207
}
210
208
@@ -216,15 +214,13 @@ impl<T> Future for BiLockAcquire<T> {
216
214
/// `unlock` method.
217
215
#[ derive( Debug ) ]
218
216
pub struct BiLockAcquired < T > {
219
- inner : BiLock < T > ,
217
+ inner : Option < BiLock < T > > ,
220
218
}
221
219
222
220
impl < T > BiLockAcquired < T > {
223
221
/// Recovers the original `BiLock<T>`, unlocking this lock.
224
222
pub fn unlock ( mut self ) -> BiLock < T > {
225
- let bi_lock = mem:: replace ( & mut self . inner , unsafe { mem:: uninitialized ( ) } ) ;
226
-
227
- mem:: forget ( self ) ;
223
+ let bi_lock = self . inner . take ( ) . unwrap ( ) ;
228
224
229
225
bi_lock. unlock ( ) ;
230
226
@@ -235,18 +231,20 @@ impl<T> BiLockAcquired<T> {
235
231
impl < T > Deref for BiLockAcquired < T > {
236
232
type Target = T ;
237
233
fn deref ( & self ) -> & T {
238
- unsafe { & * self . inner . inner . inner . get ( ) }
234
+ unsafe { & * self . inner . as_ref ( ) . unwrap ( ) . inner . inner . get ( ) }
239
235
}
240
236
}
241
237
242
238
impl < T > DerefMut for BiLockAcquired < T > {
243
239
fn deref_mut ( & mut self ) -> & mut T {
244
- unsafe { & mut * self . inner . inner . inner . get ( ) }
240
+ unsafe { & mut * self . inner . as_mut ( ) . unwrap ( ) . inner . inner . get ( ) }
245
241
}
246
242
}
247
243
248
244
impl < T > Drop for BiLockAcquired < T > {
249
245
fn drop ( & mut self ) {
250
- self . inner . unlock ( ) ;
246
+ if let Some ( ref bi_lock) = self . inner {
247
+ bi_lock. unlock ( ) ;
248
+ }
251
249
}
252
250
}
0 commit comments