mirror of
https://github.com/tokio-rs/tokio.git
synced 2025-10-01 12:20:39 +00:00
time: don't store deadline twice in sleep entries (#5410)
This commit is contained in:
parent
09b2653e71
commit
d96bbf0465
@ -298,9 +298,11 @@ pub(crate) struct TimerEntry {
|
|||||||
/// This is manipulated only under the inner mutex. TODO: Can we use loom
|
/// This is manipulated only under the inner mutex. TODO: Can we use loom
|
||||||
/// cells for this?
|
/// cells for this?
|
||||||
inner: StdUnsafeCell<TimerShared>,
|
inner: StdUnsafeCell<TimerShared>,
|
||||||
/// Initial deadline for the timer. This is used to register on the first
|
/// Deadline for the timer. This is used to register on the first
|
||||||
/// poll, as we can't register prior to being pinned.
|
/// poll, as we can't register prior to being pinned.
|
||||||
initial_deadline: Option<Instant>,
|
deadline: Instant,
|
||||||
|
/// Whether the deadline has been registered.
|
||||||
|
registered: bool,
|
||||||
/// Ensure the type is !Unpin
|
/// Ensure the type is !Unpin
|
||||||
_m: std::marker::PhantomPinned,
|
_m: std::marker::PhantomPinned,
|
||||||
}
|
}
|
||||||
@ -504,7 +506,8 @@ impl TimerEntry {
|
|||||||
Self {
|
Self {
|
||||||
driver,
|
driver,
|
||||||
inner: StdUnsafeCell::new(TimerShared::new()),
|
inner: StdUnsafeCell::new(TimerShared::new()),
|
||||||
initial_deadline: Some(deadline),
|
deadline,
|
||||||
|
registered: false,
|
||||||
_m: std::marker::PhantomPinned,
|
_m: std::marker::PhantomPinned,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -513,8 +516,12 @@ impl TimerEntry {
|
|||||||
unsafe { &*self.inner.get() }
|
unsafe { &*self.inner.get() }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn deadline(&self) -> Instant {
|
||||||
|
self.deadline
|
||||||
|
}
|
||||||
|
|
||||||
pub(crate) fn is_elapsed(&self) -> bool {
|
pub(crate) fn is_elapsed(&self) -> bool {
|
||||||
!self.inner().state.might_be_registered() && self.initial_deadline.is_none()
|
!self.inner().state.might_be_registered() && self.registered
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Cancels and deregisters the timer. This operation is irreversible.
|
/// Cancels and deregisters the timer. This operation is irreversible.
|
||||||
@ -545,7 +552,8 @@ impl TimerEntry {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn reset(mut self: Pin<&mut Self>, new_time: Instant) {
|
pub(crate) fn reset(mut self: Pin<&mut Self>, new_time: Instant) {
|
||||||
unsafe { self.as_mut().get_unchecked_mut() }.initial_deadline = None;
|
unsafe { self.as_mut().get_unchecked_mut() }.deadline = new_time;
|
||||||
|
unsafe { self.as_mut().get_unchecked_mut() }.registered = true;
|
||||||
|
|
||||||
let tick = self.driver().time_source().deadline_to_tick(new_time);
|
let tick = self.driver().time_source().deadline_to_tick(new_time);
|
||||||
|
|
||||||
@ -567,7 +575,8 @@ impl TimerEntry {
|
|||||||
panic!("{}", crate::util::error::RUNTIME_SHUTTING_DOWN_ERROR);
|
panic!("{}", crate::util::error::RUNTIME_SHUTTING_DOWN_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(deadline) = self.initial_deadline {
|
if !self.registered {
|
||||||
|
let deadline = self.deadline;
|
||||||
self.as_mut().reset(deadline);
|
self.as_mut().reset(deadline);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -235,7 +235,6 @@ pin_project! {
|
|||||||
cfg_trace! {
|
cfg_trace! {
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
struct Inner {
|
struct Inner {
|
||||||
deadline: Instant,
|
|
||||||
ctx: trace::AsyncOpTracingCtx,
|
ctx: trace::AsyncOpTracingCtx,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -243,7 +242,6 @@ cfg_trace! {
|
|||||||
cfg_not_trace! {
|
cfg_not_trace! {
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
struct Inner {
|
struct Inner {
|
||||||
deadline: Instant,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -297,11 +295,11 @@ impl Sleep {
|
|||||||
resource_span,
|
resource_span,
|
||||||
};
|
};
|
||||||
|
|
||||||
Inner { deadline, ctx }
|
Inner { ctx }
|
||||||
};
|
};
|
||||||
|
|
||||||
#[cfg(not(all(tokio_unstable, feature = "tracing")))]
|
#[cfg(not(all(tokio_unstable, feature = "tracing")))]
|
||||||
let inner = Inner { deadline };
|
let inner = Inner {};
|
||||||
|
|
||||||
Sleep { inner, entry }
|
Sleep { inner, entry }
|
||||||
}
|
}
|
||||||
@ -312,7 +310,7 @@ impl Sleep {
|
|||||||
|
|
||||||
/// Returns the instant at which the future will complete.
|
/// Returns the instant at which the future will complete.
|
||||||
pub fn deadline(&self) -> Instant {
|
pub fn deadline(&self) -> Instant {
|
||||||
self.inner.deadline
|
self.entry.deadline()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns `true` if `Sleep` has elapsed.
|
/// Returns `true` if `Sleep` has elapsed.
|
||||||
@ -358,7 +356,6 @@ impl Sleep {
|
|||||||
fn reset_inner(self: Pin<&mut Self>, deadline: Instant) {
|
fn reset_inner(self: Pin<&mut Self>, deadline: Instant) {
|
||||||
let mut me = self.project();
|
let mut me = self.project();
|
||||||
me.entry.as_mut().reset(deadline);
|
me.entry.as_mut().reset(deadline);
|
||||||
(me.inner).deadline = deadline;
|
|
||||||
|
|
||||||
#[cfg(all(tokio_unstable, feature = "tracing"))]
|
#[cfg(all(tokio_unstable, feature = "tracing"))]
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user