|
|
|
@ -96,11 +96,17 @@ impl<T, S: MutexSupport> Mutex<T, S>
|
|
|
|
|
impl<T: ?Sized, S: MutexSupport> Mutex<T, S>
|
|
|
|
|
{
|
|
|
|
|
fn obtain_lock(&self) {
|
|
|
|
|
while self.lock.compare_and_swap(false, true, Ordering::Acquire) != false {
|
|
|
|
|
// Wait until the lock looks unlocked before retrying
|
|
|
|
|
while self.lock.load(Ordering::Relaxed) {
|
|
|
|
|
self.support.cpu_relax();
|
|
|
|
|
}
|
|
|
|
|
while true {
|
|
|
|
|
match self.lock.compare_exchange(false, true, Ordering::Acquire, Ordering::Acquire) {
|
|
|
|
|
Ok(X) => break,
|
|
|
|
|
Err(X) => {
|
|
|
|
|
// Wait until the lock looks unlocked before retrying
|
|
|
|
|
while self.lock.load(Ordering::Relaxed) {
|
|
|
|
|
self.support.cpu_relax();
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -144,13 +150,13 @@ impl<T: ?Sized, S: MutexSupport> Mutex<T, S>
|
|
|
|
|
/// a guard within Some.
|
|
|
|
|
pub fn try_lock(&self) -> Option<MutexGuard<T, S>> {
|
|
|
|
|
let support_guard = S::before_lock();
|
|
|
|
|
if self.lock.compare_and_swap(false, true, Ordering::Acquire) == false {
|
|
|
|
|
Some(MutexGuard {
|
|
|
|
|
mutex: self,
|
|
|
|
|
support_guard,
|
|
|
|
|
})
|
|
|
|
|
} else {
|
|
|
|
|
None
|
|
|
|
|
match self.lock.compare_exchange(false, true, Ordering::Acquire, Ordering::Acquire) {
|
|
|
|
|
Ok(X) =>
|
|
|
|
|
Some(MutexGuard {
|
|
|
|
|
mutex: self,
|
|
|
|
|
support_guard,
|
|
|
|
|
}),
|
|
|
|
|
Err(X) => None,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|