@@ -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,33 +214,37 @@ 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
- pub fn unlock ( self ) -> BiLock < T > {
225
- // note that unlocked is implemented in `Drop`, so we don't do anything
226
- // here other than creating a new handle to return.
227
- BiLock { inner : self . inner . inner . clone ( ) }
222
+ pub fn unlock ( mut self ) -> BiLock < T > {
223
+ let bi_lock = self . inner . take ( ) . unwrap ( ) ;
224
+
225
+ bi_lock. unlock ( ) ;
226
+
227
+ bi_lock
228
228
}
229
229
}
230
230
231
231
impl < T > Deref for BiLockAcquired < T > {
232
232
type Target = T ;
233
233
fn deref ( & self ) -> & T {
234
- unsafe { & * self . inner . inner . inner . get ( ) }
234
+ unsafe { & * self . inner . as_ref ( ) . unwrap ( ) . inner . inner . get ( ) }
235
235
}
236
236
}
237
237
238
238
impl < T > DerefMut for BiLockAcquired < T > {
239
239
fn deref_mut ( & mut self ) -> & mut T {
240
- unsafe { & mut * self . inner . inner . inner . get ( ) }
240
+ unsafe { & mut * self . inner . as_mut ( ) . unwrap ( ) . inner . inner . get ( ) }
241
241
}
242
242
}
243
243
244
244
impl < T > Drop for BiLockAcquired < T > {
245
245
fn drop ( & mut self ) {
246
- self . inner . unlock ( ) ;
246
+ if let Some ( ref bi_lock) = self . inner {
247
+ bi_lock. unlock ( ) ;
248
+ }
247
249
}
248
250
}
0 commit comments