Convert u128 to nanosecond
This commit is contained in:
parent
844450ae3a
commit
0bca4e1a22
@ -39,15 +39,11 @@ impl Instant {
|
|||||||
InstantKind::Virtual { nanoseconds },
|
InstantKind::Virtual { nanoseconds },
|
||||||
InstantKind::Virtual { nanoseconds: earlier },
|
InstantKind::Virtual { nanoseconds: earlier },
|
||||||
) => {
|
) => {
|
||||||
// Trade some nanosecond precision to prevent as much overflow as possible.
|
// If it exceeded u64::MAX nanosecond, we will just keep u64::MAX nanosecond,
|
||||||
let duration = match u64::try_from(
|
// Duration can't take in more than u64::MAX.
|
||||||
// Manually convert from nanosecond to millisecond.
|
let duration = match u64::try_from(nanoseconds.saturating_sub(earlier)) {
|
||||||
// If it exceeded u64::MAX millisecond, we will just use u64::MAX millisecond,
|
Ok(nanosecond) => Duration::from_nanos(nanosecond),
|
||||||
// Duration can't take in more than u64::MAX millisecond.
|
Err(_err) => Duration::from_nanos(u64::MAX),
|
||||||
nanoseconds.saturating_sub(earlier).saturating_div(1_000_000),
|
|
||||||
) {
|
|
||||||
Ok(millisecond) => Duration::from_millis(millisecond),
|
|
||||||
_ => Duration::from_millis(u64::MAX),
|
|
||||||
};
|
};
|
||||||
Duration::new(duration.as_secs(), duration.subsec_nanos())
|
Duration::new(duration.as_secs(), duration.subsec_nanos())
|
||||||
}
|
}
|
||||||
@ -104,7 +100,7 @@ impl Clock {
|
|||||||
ClockKind::Host { .. } => std::thread::sleep(duration),
|
ClockKind::Host { .. } => std::thread::sleep(duration),
|
||||||
ClockKind::Virtual { nanoseconds } => {
|
ClockKind::Virtual { nanoseconds } => {
|
||||||
// Just pretend that we have slept for some time.
|
// Just pretend that we have slept for some time.
|
||||||
let nanos: u128 = duration.as_nanos().try_into().unwrap();
|
let nanos: u128 = duration.as_nanos();
|
||||||
nanoseconds.update(|x| x + nanos);
|
nanoseconds.update(|x| x + nanos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -280,7 +280,7 @@ fn concurrent_wait_wake() {
|
|||||||
assert!(woken > 0 && woken < rounds);
|
assert!(woken > 0 && woken < rounds);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reproduce of https://github.com/rust-lang/miri/issues/3647.
|
// Reproduce https://github.com/rust-lang/miri/issues/3647. This should not ICE.
|
||||||
fn large_timeout() {
|
fn large_timeout() {
|
||||||
let futex: i32 = 123;
|
let futex: i32 = 123;
|
||||||
|
|
||||||
@ -296,7 +296,6 @@ fn large_timeout() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
large_timeout();
|
|
||||||
wake_nobody();
|
wake_nobody();
|
||||||
wake_dangling();
|
wake_dangling();
|
||||||
wait_wrong_val();
|
wait_wrong_val();
|
||||||
@ -305,4 +304,5 @@ fn main() {
|
|||||||
wait_wake();
|
wait_wake();
|
||||||
wait_wake_bitset();
|
wait_wake_bitset();
|
||||||
concurrent_wait_wake();
|
concurrent_wait_wake();
|
||||||
|
large_timeout();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user