Skip to content

Commit 4ba6679

Browse files
committed
Unnecessary atomic operations in BiLockAcquire.poll
1 parent 264083a commit 4ba6679

File tree

1 file changed

+12
-14
lines changed

1 file changed

+12
-14
lines changed

src/sync/bilock.rs

+12-14
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ impl<T> BiLock<T> {
127127
/// Note that the returned future will never resolve to an error.
128128
pub fn lock(self) -> BiLockAcquire<T> {
129129
BiLockAcquire {
130-
inner: self,
130+
inner: Some(self),
131131
}
132132
}
133133

@@ -188,23 +188,21 @@ impl<'a, T> Drop for BiLockGuard<'a, T> {
188188
/// acquired.
189189
#[derive(Debug)]
190190
pub struct BiLockAcquire<T> {
191-
inner: BiLock<T>,
191+
inner: Option<BiLock<T>>,
192192
}
193193

194194
impl<T> Future for BiLockAcquire<T> {
195195
type Item = BiLockAcquired<T>;
196196
type Error = ();
197197

198198
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() {
200200
Async::Ready(r) => {
201201
mem::forget(r);
202-
Ok(BiLockAcquired {
203-
inner: BiLock { inner: self.inner.inner.clone() },
204-
}.into())
205202
}
206-
Async::NotReady => Ok(Async::NotReady),
203+
Async::NotReady => return Ok(Async::NotReady),
207204
}
205+
Ok(Async::Ready(BiLockAcquired { inner: self.inner.take() }))
208206
}
209207
}
210208

@@ -216,15 +214,13 @@ impl<T> Future for BiLockAcquire<T> {
216214
/// `unlock` method.
217215
#[derive(Debug)]
218216
pub struct BiLockAcquired<T> {
219-
inner: BiLock<T>,
217+
inner: Option<BiLock<T>>,
220218
}
221219

222220
impl<T> BiLockAcquired<T> {
223221
/// Recovers the original `BiLock<T>`, unlocking this lock.
224222
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();
228224

229225
bi_lock.unlock();
230226

@@ -235,18 +231,20 @@ impl<T> BiLockAcquired<T> {
235231
impl<T> Deref for BiLockAcquired<T> {
236232
type Target = T;
237233
fn deref(&self) -> &T {
238-
unsafe { &*self.inner.inner.inner.get() }
234+
unsafe { &*self.inner.as_ref().unwrap().inner.inner.get() }
239235
}
240236
}
241237

242238
impl<T> DerefMut for BiLockAcquired<T> {
243239
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() }
245241
}
246242
}
247243

248244
impl<T> Drop for BiLockAcquired<T> {
249245
fn drop(&mut self) {
250-
self.inner.unlock();
246+
if let Some(ref bi_lock) = self.inner {
247+
bi_lock.unlock();
248+
}
251249
}
252250
}

0 commit comments

Comments
 (0)