Fix dur2intervals import on cloudabi

This commit is contained in:
Linus Färnstrand 2018-12-13 15:24:50 +01:00
parent 9511fc7845
commit 9e5e89a0d3
3 changed files with 9 additions and 5 deletions

View file

@ -13,7 +13,7 @@ use mem;
use sync::atomic::{AtomicU32, Ordering}; use sync::atomic::{AtomicU32, Ordering};
use sys::cloudabi::abi; use sys::cloudabi::abi;
use sys::mutex::{self, Mutex}; use sys::mutex::{self, Mutex};
use sys::time::dur2intervals; use sys::time::checked_dur2intervals;
use time::Duration; use time::Duration;
extern "C" { extern "C" {
@ -114,6 +114,8 @@ impl Condvar {
// Call into the kernel to wait on the condition variable. // Call into the kernel to wait on the condition variable.
let condvar = self.condvar.get(); let condvar = self.condvar.get();
let timeout = checked_dur2intervals(&dur)
.expect("overflow converting duration to nanoseconds");
let subscriptions = [ let subscriptions = [
abi::subscription { abi::subscription {
type_: abi::eventtype::CONDVAR, type_: abi::eventtype::CONDVAR,
@ -132,7 +134,7 @@ impl Condvar {
union: abi::subscription_union { union: abi::subscription_union {
clock: abi::subscription_clock { clock: abi::subscription_clock {
clock_id: abi::clockid::MONOTONIC, clock_id: abi::clockid::MONOTONIC,
timeout: dur2intervals(&dur), timeout,
..mem::zeroed() ..mem::zeroed()
}, },
}, },

View file

@ -16,7 +16,7 @@ use libc;
use mem; use mem;
use ptr; use ptr;
use sys::cloudabi::abi; use sys::cloudabi::abi;
use sys::time::dur2intervals; use sys::time::checked_dur2intervals;
use sys_common::thread::*; use sys_common::thread::*;
use time::Duration; use time::Duration;
@ -70,13 +70,15 @@ impl Thread {
} }
pub fn sleep(dur: Duration) { pub fn sleep(dur: Duration) {
let timeout = checked_dur2intervals(&dur)
.expect("overflow converting duration to nanoseconds");
unsafe { unsafe {
let subscription = abi::subscription { let subscription = abi::subscription {
type_: abi::eventtype::CLOCK, type_: abi::eventtype::CLOCK,
union: abi::subscription_union { union: abi::subscription_union {
clock: abi::subscription_clock { clock: abi::subscription_clock {
clock_id: abi::clockid::MONOTONIC, clock_id: abi::clockid::MONOTONIC,
timeout: dur2intervals(&dur), timeout,
..mem::zeroed() ..mem::zeroed()
}, },
}, },

View file

@ -19,7 +19,7 @@ pub struct Instant {
t: abi::timestamp, t: abi::timestamp,
} }
fn checked_dur2intervals(dur: &Duration) -> Option<abi::timestamp> { pub fn checked_dur2intervals(dur: &Duration) -> Option<abi::timestamp> {
dur.as_secs() dur.as_secs()
.checked_mul(NSEC_PER_SEC)? .checked_mul(NSEC_PER_SEC)?
.checked_add(dur.subsec_nanos() as abi::timestamp) .checked_add(dur.subsec_nanos() as abi::timestamp)