X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=lightning%2Fsrc%2Fsync%2Fnostd_sync.rs;h=ee3e375028eba44bbb0ac723b0eb520c398be227;hb=a1b5a1bba38e0a4ab08603adbcf9e54f27e86f19;hp=e17aa6ab15faa5dc33b66dbc1b80ab79fd36cb18;hpb=e954ee8256a70ee917135f4c03c8726bf305c2fc;p=rust-lightning diff --git a/lightning/src/sync/nostd_sync.rs b/lightning/src/sync/nostd_sync.rs index e17aa6ab..ee3e3750 100644 --- a/lightning/src/sync/nostd_sync.rs +++ b/lightning/src/sync/nostd_sync.rs @@ -8,6 +8,11 @@ pub type LockResult = Result; pub struct Condvar {} +pub struct WaitTimeoutResult(bool); +impl WaitTimeoutResult { + pub fn timed_out(&self) -> bool { self.0 } +} + impl Condvar { pub fn new() -> Condvar { Condvar { } @@ -22,6 +27,22 @@ impl Condvar { Ok((guard, ())) } + pub fn wait_while<'a, T, F: FnMut(&mut T) -> bool>(&'a self, mut guard: MutexGuard<'a, T>, mut condition: F) + -> LockResult> { + assert!(!condition(&mut *guard)); + Ok(guard) + } + + #[allow(unused)] + pub fn wait_timeout_while<'a, T, F: FnMut(&mut T) -> bool>(&'a self, mut guard: MutexGuard<'a, T>, dur: Duration, mut condition: F) + -> LockResult<(MutexGuard<'a, T>, WaitTimeoutResult)> { + if condition(&mut *guard) { + Ok((guard, WaitTimeoutResult(true))) + } else { + Ok((guard, WaitTimeoutResult(false))) + } + } + pub fn notify_all(&self) {} } @@ -60,14 +81,21 @@ impl Mutex { pub fn try_lock<'a>(&'a self) -> LockResult> { Ok(MutexGuard { lock: self.inner.borrow_mut() }) } + + pub fn into_inner(self) -> LockResult { + Ok(self.inner.into_inner()) + } } -impl LockTestExt for Mutex { +impl<'a, T: 'a> LockTestExt<'a> for Mutex { #[inline] fn held_by_thread(&self) -> LockHeldState { if self.lock().is_err() { return LockHeldState::HeldByThread; } else { return LockHeldState::NotHeldByThread; } } + type ExclLock = MutexGuard<'a, T>; + #[inline] + fn unsafe_well_ordered_double_lock_self(&'a self) -> MutexGuard { self.lock().unwrap() } } pub struct RwLock { @@ -125,12 +153,15 @@ impl RwLock { } } -impl LockTestExt for RwLock { +impl<'a, T: 'a> LockTestExt<'a> for RwLock { #[inline] fn held_by_thread(&self) -> LockHeldState { if self.write().is_err() { return LockHeldState::HeldByThread; } else { return LockHeldState::NotHeldByThread; } } + type ExclLock = RwLockWriteGuard<'a, T>; + #[inline] + fn unsafe_well_ordered_double_lock_self(&'a self) -> RwLockWriteGuard { self.write().unwrap() } } pub type FairRwLock = RwLock;