SystemTime::now not work stable on my win7 32, change to Instant

This commit is contained in:
rustdesk 2022-04-22 02:05:11 +08:00
parent f8fe47d53f
commit 5d143f57d7

View File

@ -21,7 +21,7 @@ use std::{
atomic::{AtomicBool, Ordering}, atomic::{AtomicBool, Ordering},
Arc, Mutex, Arc, Mutex,
}, },
time::{Instant, SystemTime}, time::Instant,
}; };
use uuid::Uuid; use uuid::Uuid;
@ -113,24 +113,23 @@ impl RendezvousMediator {
const TIMER_OUT: Duration = Duration::from_secs(1); const TIMER_OUT: Duration = Duration::from_secs(1);
let mut timer = interval(TIMER_OUT); let mut timer = interval(TIMER_OUT);
let mut last_timer = SystemTime::UNIX_EPOCH; let mut last_timer: Option<Instant> = None;
const REG_TIMEOUT: i64 = 3_000; const REG_TIMEOUT: i64 = 3_000;
const MAX_FAILS1: i64 = 3; const MAX_FAILS1: i64 = 3;
const MAX_FAILS2: i64 = 6; const MAX_FAILS2: i64 = 6;
const DNS_INTERVAL: i64 = 60_000; const DNS_INTERVAL: i64 = 60_000;
let mut fails = 0; let mut fails = 0;
let mut last_register_resp = SystemTime::UNIX_EPOCH; let mut last_register_resp: Option<Instant> = None;
let mut last_register_sent = SystemTime::UNIX_EPOCH; let mut last_register_sent: Option<Instant> = None;
let mut last_dns_check = SystemTime::UNIX_EPOCH; let mut last_dns_check = Instant::now();
let mut old_latency = 0; let mut old_latency = 0;
let mut ema_latency = 0; let mut ema_latency = 0;
loop { loop {
let mut update_latency = || { let mut update_latency = || {
last_register_resp = SystemTime::now(); last_register_resp = Some(Instant::now());
fails = 0; fails = 0;
let mut latency = last_register_resp let mut latency = last_register_sent
.duration_since(last_register_sent) .map(|x| x.elapsed().as_micros() as i64)
.map(|d| d.as_micros() as i64)
.unwrap_or(0); .unwrap_or(0);
if latency < 0 || latency > 1_000_000 { if latency < 0 || latency > 1_000_000 {
return; return;
@ -224,14 +223,14 @@ impl RendezvousMediator {
if SHOULD_EXIT.load(Ordering::SeqCst) { if SHOULD_EXIT.load(Ordering::SeqCst) {
break; break;
} }
let now = SystemTime::now(); let now = Some(Instant::now());
if now.duration_since(last_timer).map(|d| d < TIMER_OUT).unwrap_or(false) { if last_timer.map(|x| x.elapsed() < TIMER_OUT).unwrap_or(false) {
// a workaround of tokio timer bug // a workaround of tokio timer bug
continue; continue;
} }
last_timer = now; last_timer = now;
let elapsed_resp = now.duration_since(last_register_resp).map(|d| d.as_millis() as i64).unwrap_or(REG_INTERVAL); let elapsed_resp = last_register_resp.map(|x| x.elapsed().as_millis() as i64).unwrap_or(REG_INTERVAL);
let timeout = last_register_sent.duration_since(last_register_resp).map(|d| d.as_millis() as i64).unwrap_or(0) >= REG_TIMEOUT; let timeout = (last_register_sent.map(|x| x.elapsed().as_millis() as i64).unwrap_or(REG_INTERVAL) - elapsed_resp) > REG_TIMEOUT;
if timeout || elapsed_resp >= REG_INTERVAL { if timeout || elapsed_resp >= REG_INTERVAL {
allow_err!(rz.register_peer(&mut socket).await); allow_err!(rz.register_peer(&mut socket).await);
last_register_sent = now; last_register_sent = now;
@ -240,14 +239,14 @@ impl RendezvousMediator {
if fails > MAX_FAILS2 { if fails > MAX_FAILS2 {
Config::update_latency(&host, -1); Config::update_latency(&host, -1);
old_latency = 0; old_latency = 0;
if now.duration_since(last_dns_check).map(|d| d.as_millis() as i64).unwrap_or(0) > DNS_INTERVAL { if last_dns_check.elapsed().as_millis() as i64 > DNS_INTERVAL {
rz.addr = socket_client::get_target_addr(&crate::check_port(&host, RENDEZVOUS_PORT))?; rz.addr = socket_client::get_target_addr(&crate::check_port(&host, RENDEZVOUS_PORT))?;
// in some case of network reconnect (dial IP network), // in some case of network reconnect (dial IP network),
// old UDP socket not work any more after network recover // old UDP socket not work any more after network recover
if let Some(s) = socket_client::rebind_udp(any_addr).await? { if let Some(s) = socket_client::rebind_udp(any_addr).await? {
socket = s; socket = s;
} }
last_dns_check = now; last_dns_check = Instant::now();
} }
} else if fails > MAX_FAILS1 { } else if fails > MAX_FAILS1 {
Config::update_latency(&host, 0); Config::update_latency(&host, 0);