|
|
@@ -17,7 +17,10 @@ static SLEEPERS_LIST: Spin<BinaryHeap<Reverse<Sleepers>>> = Spin::new(BinaryHeap
|
|
|
#[derive(Debug, Clone, Copy, Eq, PartialEq, Ord, PartialOrd)]
|
|
|
pub struct Ticks(usize);
|
|
|
|
|
|
-pub struct Instant(Ticks);
|
|
|
+pub struct Instant {
|
|
|
+ secs_since_epoch: u64,
|
|
|
+ nsecs_within: u32,
|
|
|
+}
|
|
|
|
|
|
struct Sleepers {
|
|
|
wakeup_tick: Ticks,
|
|
|
@@ -71,24 +74,31 @@ impl Ticks {
|
|
|
}
|
|
|
|
|
|
impl Instant {
|
|
|
- pub fn now() -> Self {
|
|
|
- Instant(Ticks::now())
|
|
|
+ pub fn new(secs_since_epoch: u64, nsecs_within: u32) -> Self {
|
|
|
+ Instant {
|
|
|
+ secs_since_epoch,
|
|
|
+ nsecs_within,
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
pub fn elapsed(&self) -> Duration {
|
|
|
- Duration::from_nanos((Ticks::now().in_nsecs() - self.0.in_nsecs()) as u64)
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-impl From<Ticks> for Instant {
|
|
|
- fn from(ticks: Ticks) -> Self {
|
|
|
- Instant(ticks)
|
|
|
+ let now = Instant::now();
|
|
|
+ if now.nsecs_within < self.nsecs_within {
|
|
|
+ // We have wrapped around the nanoseconds.
|
|
|
+ Duration::new(
|
|
|
+ now.secs_since_epoch - self.secs_since_epoch - 1,
|
|
|
+ 1_000_000_000 + now.nsecs_within - self.nsecs_within,
|
|
|
+ )
|
|
|
+ } else {
|
|
|
+ Duration::new(
|
|
|
+ now.secs_since_epoch - self.secs_since_epoch,
|
|
|
+ now.nsecs_within - self.nsecs_within,
|
|
|
+ )
|
|
|
+ }
|
|
|
}
|
|
|
-}
|
|
|
|
|
|
-impl From<Instant> for Ticks {
|
|
|
- fn from(instant: Instant) -> Self {
|
|
|
- instant.0
|
|
|
+ pub fn since_epoch(&self) -> Duration {
|
|
|
+ Duration::new(self.secs_since_epoch, self.nsecs_within)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -104,7 +114,15 @@ impl Add<Duration> for Instant {
|
|
|
type Output = Instant;
|
|
|
|
|
|
fn add(self, duration: Duration) -> Self::Output {
|
|
|
- Instant(self.0 + Ticks(duration.as_millis() as usize))
|
|
|
+ let nsecs = self.nsecs_within + duration.subsec_nanos();
|
|
|
+ let nsecs_within = nsecs % 1_000_000_000;
|
|
|
+ let secs_since_epoch =
|
|
|
+ self.secs_since_epoch + duration.as_secs() + (nsecs / 1_000_000_000) as u64;
|
|
|
+
|
|
|
+ Instant {
|
|
|
+ secs_since_epoch,
|
|
|
+ nsecs_within: nsecs_within,
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -156,13 +174,8 @@ pub fn should_reschedule() -> bool {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-pub fn ticks() -> Ticks {
|
|
|
- Ticks::now()
|
|
|
-}
|
|
|
-
|
|
|
pub async fn sleep(duration: Duration) {
|
|
|
- let wakeup_time = Instant::now() + duration;
|
|
|
- let wakeup_tick = Ticks::from(wakeup_time);
|
|
|
+ let wakeup_tick = Ticks::now() + Ticks(duration.as_millis() as usize);
|
|
|
|
|
|
core::future::poll_fn(|ctx| {
|
|
|
if Ticks::now() >= wakeup_tick {
|