Skip to content

Commit 10eb2c8

Browse files
fix(netwatch): prevent time_jumped signal loss in actor debounce
1 parent da51515 commit 10eb2c8

1 file changed

Lines changed: 9 additions & 7 deletions

File tree

netwatch/src/netmon/actor.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,8 @@ impl Actor {
9090
pub(super) async fn run(mut self) {
9191
const DEBOUNCE: Duration = Duration::from_millis(250);
9292

93-
let mut last_event = None;
93+
let mut pending_change = false;
94+
let mut pending_time_jump = false;
9495
let mut debounce_interval = time::interval(DEBOUNCE);
9596
let mut wall_time_interval = time::interval(POLL_WALL_TIME_INTERVAL);
9697

@@ -99,23 +100,24 @@ impl Actor {
99100
biased;
100101

101102
_ = debounce_interval.tick() => {
102-
if let Some(time_jumped) = last_event.take() {
103-
self.handle_potential_change(time_jumped).await;
103+
if pending_change || pending_time_jump {
104+
self.handle_potential_change(pending_time_jump).await;
105+
pending_change = false;
106+
pending_time_jump = false;
104107
}
105108
}
106109
_ = wall_time_interval.tick() => {
107110
trace!("tick: wall_time_interval");
108111
if self.check_wall_time_advance() {
109-
// Trigger potential change
110-
last_event.replace(true);
112+
pending_time_jump = true;
111113
debounce_interval.reset_immediately();
112114
}
113115
}
114116
event = self.mon_receiver.recv() => {
115117
match event {
116118
Some(NetworkMessage::Change) => {
117119
trace!("network activity detected");
118-
last_event.replace(false);
120+
pending_change = true;
119121
debounce_interval.reset_immediately();
120122
}
121123
None => {
@@ -128,7 +130,7 @@ impl Actor {
128130
match msg {
129131
Some(ActorMessage::NetworkChange) => {
130132
trace!("external network activity detected");
131-
last_event.replace(false);
133+
pending_change = true;
132134
debounce_interval.reset_immediately();
133135
}
134136
None => {

0 commit comments

Comments
 (0)