diff --git a/library/std/src/sys/hermit/condvar.rs b/library/std/src/sys/hermit/condvar.rs index 603e9193d89d6..3b5e11284545a 100644 --- a/library/std/src/sys/hermit/condvar.rs +++ b/library/std/src/sys/hermit/condvar.rs @@ -56,17 +56,19 @@ impl Condvar { } 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; + + let res = if millis > 0 { + abi::sem_timedwait(self.sem1, millis) + } else { + abi::sem_trywait(self.sem1) + }; + abi::sem_post(self.sem2); mutex.lock(); - success + res == 0 } pub unsafe fn destroy(&self) {