diff options
| author | Martin Kröning <mkroening@posteo.net> | 2021-05-29 22:16:10 +0200 |
|---|---|---|
| committer | Martin Kröning <mkroening@posteo.net> | 2021-10-29 17:20:03 +0200 |
| commit | 42cab439f564812be0c3957edcc57140aac5a4c7 (patch) | |
| tree | 59fba9ad09c631c496f81aee9482c8eb746df611 | |
| parent | 37f70a0e1e04086aee7ae57fbefd6d4071953506 (diff) | |
| download | rust-42cab439f564812be0c3957edcc57140aac5a4c7.tar.gz rust-42cab439f564812be0c3957edcc57140aac5a4c7.zip | |
hermit: Implement Condvar::wait_timeout
| -rw-r--r-- | library/std/src/sys/hermit/condvar.rs | 16 |
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) { |
