Skip to content

Commit b6ee9a4

Browse files
committed
Store instants rather than sleep futures for timers to make ownership easier
1 parent 8c6f189 commit b6ee9a4

2 files changed

Lines changed: 19 additions & 27 deletions

File tree

crates/hotfix/src/session.rs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use std::cmp::Ordering;
1111
use std::pin::Pin;
1212
use tokio::select;
1313
use tokio::sync::{mpsc, oneshot};
14-
use tokio::time::{Duration, Instant, Sleep, sleep};
14+
use tokio::time::{Duration, Instant, Sleep, sleep, sleep_until};
1515
use tracing::{debug, error, info, warn};
1616

1717
use crate::application::{ApplicationMessage, ApplicationRef};
@@ -709,8 +709,6 @@ where
709709
{
710710
loop {
711711
let next_message = session.mailbox.recv();
712-
let heartbeat_timer = session.state.heartbeat_timer();
713-
let peer_timer = session.state.peer_timer();
714712

715713
select! {
716714
next = next_message => {
@@ -722,17 +720,17 @@ where
722720
}
723721
}
724722
() = async {
725-
if let Some(timer) = heartbeat_timer {
726-
timer.as_mut().await
723+
if let Some(deadline) = session.state.heartbeat_deadline() {
724+
sleep_until(*deadline).await
727725
} else {
728726
std::future::pending().await
729727
}
730728
} => {
731729
session.handle_heartbeat_timeout().await;
732730
}
733731
() = async {
734-
if let Some(timer) = peer_timer {
735-
timer.as_mut().await
732+
if let Some(deadline) = session.state.peer_deadline() {
733+
sleep_until(*deadline).await
736734
} else {
737735
std::future::pending().await
738736
}

crates/hotfix/src/session/state.rs

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,9 @@ use crate::session::event::AwaitingActiveSessionResponse;
33
use crate::transport::writer::WriterRef;
44
use hotfix_message::message::Message;
55
use std::collections::VecDeque;
6-
use std::pin::Pin;
76
use std::time::Duration;
87
use tokio::sync::oneshot;
9-
use tokio::time::{Instant, Sleep, sleep};
8+
use tokio::time::Instant;
109
use tracing::{debug, error};
1110

1211
const TEST_REQUEST_THRESHOLD: f64 = 1.2;
@@ -35,15 +34,12 @@ impl SessionState {
3534
}
3635

3736
pub fn new_active(writer: WriterRef, heartbeat_interval: u64) -> Self {
38-
let heartbeat_timer = Box::pin(sleep(Duration::from_secs(heartbeat_interval)));
39-
4037
let peer_interval = calculate_peer_interval(heartbeat_interval);
41-
let peer_timer = Box::pin(sleep(Duration::from_secs(peer_interval)));
4238

4339
Self::Active(ActiveState {
4440
writer,
45-
heartbeat_timer,
46-
peer_timer,
41+
heartbeat_deadline: Instant::now() + Duration::from_secs(heartbeat_interval),
42+
peer_deadline: Instant::now() + Duration::from_secs(peer_interval),
4743
})
4844
}
4945

@@ -157,37 +153,35 @@ impl SessionState {
157153
}
158154
}
159155

160-
pub fn heartbeat_timer(&mut self) -> Option<&mut Pin<Box<Sleep>>> {
156+
pub fn heartbeat_deadline(&self) -> Option<&Instant> {
161157
match self {
162158
Self::Active(ActiveState {
163-
heartbeat_timer, ..
164-
}) => Some(heartbeat_timer),
159+
heartbeat_deadline, ..
160+
}) => Some(heartbeat_deadline),
165161
_ => None,
166162
}
167163
}
168164

169165
pub fn reset_heartbeat_timer(&mut self, heartbeat_interval: u64) {
170166
if let Self::Active(ActiveState {
171-
heartbeat_timer, ..
167+
heartbeat_deadline, ..
172168
}) = self
173169
{
174-
let deadline = Instant::now() + Duration::from_secs(heartbeat_interval);
175-
heartbeat_timer.as_mut().reset(deadline);
170+
*heartbeat_deadline = Instant::now() + Duration::from_secs(heartbeat_interval);
176171
}
177172
}
178173

179-
pub fn peer_timer(&mut self) -> Option<&mut Pin<Box<Sleep>>> {
174+
pub fn peer_deadline(&self) -> Option<&Instant> {
180175
match self {
181-
Self::Active(ActiveState { peer_timer, .. }) => Some(peer_timer),
176+
Self::Active(ActiveState { peer_deadline, .. }) => Some(peer_deadline),
182177
_ => None,
183178
}
184179
}
185180

186181
pub fn reset_peer_timer(&mut self, heartbeat_interval: u64) {
187-
if let Self::Active(ActiveState { peer_timer, .. }) = self {
182+
if let Self::Active(ActiveState { peer_deadline, .. }) = self {
188183
let interval = calculate_peer_interval(heartbeat_interval);
189-
let deadline = Instant::now() + Duration::from_secs(interval);
190-
peer_timer.as_mut().reset(deadline);
184+
*peer_deadline = Instant::now() + Duration::from_secs(interval);
191185
}
192186
}
193187
}
@@ -199,8 +193,8 @@ fn calculate_peer_interval(heartbeat_interval: u64) -> u64 {
199193

200194
pub struct ActiveState {
201195
writer: WriterRef,
202-
heartbeat_timer: Pin<Box<Sleep>>,
203-
peer_timer: Pin<Box<Sleep>>,
196+
heartbeat_deadline: Instant,
197+
peer_deadline: Instant,
204198
}
205199

206200
/// Session state we're in while processing messages we requested to be resent.

0 commit comments

Comments
 (0)