From f4a38c0e16841dcb4e814ca570f63933663a1f8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Kr=C3=B6ning?= Date: Sat, 29 May 2021 22:16:10 +0200 Subject: [PATCH] hermit: Implement Condvar::wait_timeout --- library/std/src/sys/hermit/condvar.rs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/library/std/src/sys/hermit/condvar.rs b/library/std/src/sys/hermit/condvar.rs index b45e8718f088e..e22e1efba6fdb 100644 --- a/library/std/src/sys/hermit/condvar.rs +++ b/library/std/src/sys/hermit/condvar.rs @@ -55,8 +55,18 @@ impl Condvar { mutex.lock(); } - pub unsafe fn wait_timeout(&self, _mutex: &Mutex, _dur: Duration) -> bool { - panic!("wait_timeout not supported on hermit"); + pub unsafe fn wait_timeout(&self, mutex: &Mutex, dur: Duration) -> bool { + if dur.is_zero() { + return false; + } + + self.counter.fetch_add(1, SeqCst); + mutex.unlock(); + let millis = dur.as_millis().min(u32::MAX as u128) as u32; + let success = abi::sem_timedwait(self.sem1, millis) == 0; + abi::sem_post(self.sem2); + mutex.lock(); + success } pub unsafe fn destroy(&self) {