Skip to content

Commit f3986e3

Browse files
fix(netwatch): replace interval reset with sleep-based debounce for true coalescing
1 parent 10eb2c8 commit f3986e3

1 file changed

Lines changed: 9 additions & 12 deletions

File tree

netwatch/src/netmon/actor.rs

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -92,33 +92,30 @@ impl Actor {
9292

9393
let mut pending_change = false;
9494
let mut pending_time_jump = false;
95-
let mut debounce_interval = time::interval(DEBOUNCE);
95+
let debounce = time::sleep(DEBOUNCE);
96+
tokio::pin!(debounce);
9697
let mut wall_time_interval = time::interval(POLL_WALL_TIME_INTERVAL);
9798

9899
loop {
99100
tokio::select! {
100-
biased;
101-
102-
_ = debounce_interval.tick() => {
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;
107-
}
101+
_ = &mut debounce, if pending_change || pending_time_jump => {
102+
self.handle_potential_change(pending_time_jump).await;
103+
pending_change = false;
104+
pending_time_jump = false;
108105
}
109106
_ = wall_time_interval.tick() => {
110107
trace!("tick: wall_time_interval");
111108
if self.check_wall_time_advance() {
112109
pending_time_jump = true;
113-
debounce_interval.reset_immediately();
110+
debounce.as_mut().reset(Instant::now() + DEBOUNCE);
114111
}
115112
}
116113
event = self.mon_receiver.recv() => {
117114
match event {
118115
Some(NetworkMessage::Change) => {
119116
trace!("network activity detected");
120117
pending_change = true;
121-
debounce_interval.reset_immediately();
118+
debounce.as_mut().reset(Instant::now() + DEBOUNCE);
122119
}
123120
None => {
124121
debug!("shutting down, network monitor receiver gone");
@@ -131,7 +128,7 @@ impl Actor {
131128
Some(ActorMessage::NetworkChange) => {
132129
trace!("external network activity detected");
133130
pending_change = true;
134-
debounce_interval.reset_immediately();
131+
debounce.as_mut().reset(Instant::now() + DEBOUNCE);
135132
}
136133
None => {
137134
debug!("shutting down, actor receiver gone");

0 commit comments

Comments
 (0)