about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMartin Kröning <mkroening@posteo.net>2021-05-29 22:16:10 +0200
committerMartin Kröning <mkroening@posteo.net>2021-10-29 17:20:03 +0200
commit42cab439f564812be0c3957edcc57140aac5a4c7 (patch)
tree59fba9ad09c631c496f81aee9482c8eb746df611
parent37f70a0e1e04086aee7ae57fbefd6d4071953506 (diff)
downloadrust-42cab439f564812be0c3957edcc57140aac5a4c7.tar.gz
rust-42cab439f564812be0c3957edcc57140aac5a4c7.zip
hermit: Implement Condvar::wait_timeout
-rw-r--r--library/std/src/sys/hermit/condvar.rs16
1 files changed, 14 insertions, 2 deletions
diff --git a/library/std/src/sys/hermit/condvar.rs b/library/std/src/sys/hermit/condvar.rs
index fa8ef8fc37a..b62f21a9dac 100644
--- a/library/std/src/sys/hermit/condvar.rs
+++ b/library/std/src/sys/hermit/condvar.rs
@@ -55,8 +55,20 @@ 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 {
+        self.counter.fetch_add(1, SeqCst);
+        mutex.unlock();
+        let millis = dur.as_millis().min(u32::MAX as u128) as u32;
+
+        let res = if millis > 0 {
+            abi::sem_timedwait(self.sem1, millis)
+        } else {
+            abi::sem_trywait(self.sem1)
+        };
+
+        abi::sem_post(self.sem2);
+        mutex.lock();
+        res == 0
     }
 
     pub unsafe fn destroy(&self) {