From b820306cdc771ebd40a94335bfaf8e2501c29b29 Mon Sep 17 00:00:00 2001 From: Mica White Date: Fri, 15 Mar 2024 12:29:07 -0400 Subject: Insert yields to prevent spinning --- src/lockable.rs | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) (limited to 'src') diff --git a/src/lockable.rs b/src/lockable.rs index 611f0a0..0dd9b07 100644 --- a/src/lockable.rs +++ b/src/lockable.rs @@ -192,6 +192,8 @@ unsafe impl<'a, A: Lockable<'a>, B: Lockable<'a>> Lockable<'a> for (A, B) { loop { let lock0 = self.0.lock(); let Some(lock1) = self.1.try_lock() else { + drop(lock0); + std::thread::yield_now(); continue; }; @@ -226,9 +228,14 @@ unsafe impl<'a, A: Lockable<'a>, B: Lockable<'a>, C: Lockable<'a>> Lockable<'a> loop { let lock0 = self.0.lock(); let Some(lock1) = self.1.try_lock() else { + drop(lock0); + std::thread::yield_now(); continue; }; let Some(lock2) = self.2.try_lock() else { + drop(lock0); + drop(lock1); + std::thread::yield_now(); continue; }; @@ -269,12 +276,21 @@ unsafe impl<'a, A: Lockable<'a>, B: Lockable<'a>, C: Lockable<'a>, D: Lockable<' loop { let lock0 = self.0.lock(); let Some(lock1) = self.1.try_lock() else { + drop(lock0); + std::thread::yield_now(); continue; }; let Some(lock2) = self.2.try_lock() else { + drop(lock0); + drop(lock1); + std::thread::yield_now(); continue; }; let Some(lock3) = self.3.try_lock() else { + drop(lock0); + drop(lock1); + drop(lock2); + std::thread::yield_now(); continue; }; @@ -319,15 +335,29 @@ unsafe impl<'a, A: Lockable<'a>, B: Lockable<'a>, C: Lockable<'a>, D: Lockable<' loop { let lock0 = self.0.lock(); let Some(lock1) = self.1.try_lock() else { + drop(lock0); + std::thread::yield_now(); continue; }; let Some(lock2) = self.2.try_lock() else { + drop(lock0); + drop(lock1); + std::thread::yield_now(); continue; }; let Some(lock3) = self.3.try_lock() else { + drop(lock0); + drop(lock1); + drop(lock2); + std::thread::yield_now(); continue; }; let Some(lock4) = self.4.try_lock() else { + drop(lock0); + drop(lock1); + drop(lock2); + drop(lock3); + std::thread::yield_now(); continue; }; @@ -390,18 +420,38 @@ unsafe impl< loop { let lock0 = self.0.lock(); let Some(lock1) = self.1.try_lock() else { + drop(lock0); + std::thread::yield_now(); continue; }; let Some(lock2) = self.2.try_lock() else { + drop(lock0); + drop(lock1); + std::thread::yield_now(); continue; }; let Some(lock3) = self.3.try_lock() else { + drop(lock0); + drop(lock1); + drop(lock2); + std::thread::yield_now(); continue; }; let Some(lock4) = self.4.try_lock() else { + drop(lock0); + drop(lock1); + drop(lock2); + drop(lock3); + std::thread::yield_now(); continue; }; let Some(lock5) = self.5.try_lock() else { + drop(lock0); + drop(lock1); + drop(lock2); + drop(lock3); + drop(lock4); + std::thread::yield_now(); continue; }; @@ -506,6 +556,7 @@ unsafe impl<'a, T: Lockable<'a>, const N: usize> Lockable<'a> for [T; N] { Some(guard) => outputs[i].write(guard), None => { unlock_partial::(outputs, i); + std::thread::yield_now(); continue 'outer; } }; @@ -569,6 +620,8 @@ unsafe impl<'a, T: Lockable<'a>> Lockable<'a> for Box<[T]> { outputs.push(guard); } None => { + drop(outputs); + std::thread::yield_now(); continue 'outer; } }; @@ -619,6 +672,8 @@ unsafe impl<'a, T: Lockable<'a>> Lockable<'a> for Vec { outputs.push(guard); } None => { + drop(outputs); + std::thread::yield_now(); continue 'outer; } }; -- cgit v1.2.3