Skip to content

Commit b1a507b

Browse files
committed
master: set MSRV 1.70 and refactor time management
1 parent 6774fee commit b1a507b

File tree

5 files changed

+49
-47
lines changed

5 files changed

+49
-47
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ default-members = ["master", "protocol"]
1111

1212
[workspace.package]
1313
authors = ["Denis Drakhnia <numas13@gmail.com>"]
14-
rust-version = "1.68"
14+
rust-version = "1.70"
1515
homepage = "https://xash.su"
1616
repository = "https://github.com/FWGS/xash3d-master"
1717

master/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ mod time;
88

99
pub mod config;
1010

11-
use crate::{periodic::Periodic, stats::Stats, str_arr::StrArr, time::RelativeTimer};
11+
use crate::{periodic::Periodic, stats::Stats, str_arr::StrArr, time::RelativeTime};
1212

1313
pub use crate::{
1414
config::Config,

master/src/master_server.rs

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ use xash3d_protocol::{
2828

2929
use crate::{
3030
config::{Config, MasterConfig},
31-
Periodic, RelativeTimer, Stats, StrArr,
31+
Periodic, RelativeTime, Stats, StrArr,
3232
};
3333

3434
type ServerInfo = xash3d_protocol::ServerInfo<Box<[u8]>>;
@@ -117,17 +117,20 @@ pub enum Error {
117117
/// HashMap entry to keep tracking creation time.
118118
#[derive(Copy, Clone, Debug)]
119119
struct Entry<T> {
120-
time: u32,
120+
time: RelativeTime,
121121
value: T,
122122
}
123123

124124
impl<T> Entry<T> {
125-
fn new(time: u32, value: T) -> Self {
126-
Self { time, value }
125+
fn new(value: T) -> Self {
126+
Self {
127+
time: RelativeTime::now(),
128+
value,
129+
}
127130
}
128131

129-
fn is_valid(&self, now: u32, duration: u32) -> bool {
130-
(now - self.time) < duration
132+
fn is_valid(&self, now: RelativeTime, secs: u32) -> bool {
133+
now.duration_since(self.time).as_secs() < secs as u64
131134
}
132135
}
133136

@@ -212,7 +215,6 @@ type CleanupHashMap<K, V> = Periodic<HashMap<K, V>>;
212215
pub struct MasterServer<Addr: AddrExt> {
213216
cfg: MasterConfig,
214217
rng: Rng,
215-
time: RelativeTimer,
216218

217219
sock: UdpSocket,
218220
challenges: CleanupHashMap<Addr, Entry<u32>>,
@@ -248,7 +250,6 @@ impl<Addr: AddrExt> MasterServer<Addr> {
248250
cfg: cfg.master,
249251

250252
sock,
251-
time: RelativeTimer::new(),
252253
challenges: Default::default(),
253254
servers: Default::default(),
254255
rng: Rng::new(),
@@ -344,7 +345,7 @@ impl<Addr: AddrExt> MasterServer<Addr> {
344345
return Ok(());
345346
}
346347
};
347-
if !entry.is_valid(self.time.now(), self.cfg.server.timeout.challenge) {
348+
if !entry.is_valid(RelativeTime::now(), self.cfg.server.timeout.challenge) {
348349
return Ok(());
349350
}
350351
if p.version < self.cfg.server.min_version {
@@ -453,7 +454,7 @@ impl<Addr: AddrExt> MasterServer<Addr> {
453454
self.filtered_servers.clear();
454455
self.filtered_servers_nat.clear();
455456

456-
let now = self.time.now();
457+
let now = RelativeTime::now();
457458
for (addr, info) in self.servers.iter() {
458459
// skip if server is outdated
459460
if !info.is_valid(now, self.cfg.server.timeout.server) {
@@ -499,11 +500,12 @@ impl<Addr: AddrExt> MasterServer<Addr> {
499500
trace!("{from}: {err_msg}, gamedir is invalid {gamedir:?}");
500501
return;
501502
};
502-
let now = self.time.now();
503-
let entry = Entry::new(now, gamedir);
503+
let entry = Entry::new(gamedir);
504504
self.update_gamedir.insert(from, entry);
505-
self.update_gamedir
506-
.maybe_run(|map| map.retain(|_, v| v.is_valid(now, 5)));
505+
self.update_gamedir.maybe_run(|map| {
506+
let now = RelativeTime::now();
507+
map.retain(|_, v| v.is_valid(now, 5))
508+
});
507509
}
508510

509511
fn send_update_info(&mut self, from: Addr, protocol: u8) -> Result<(), Error> {
@@ -541,7 +543,7 @@ impl<Addr: AddrExt> MasterServer<Addr> {
541543
fn handle_admin_packet(&mut self, from: Addr, p: admin::Packet) -> Result<(), Error> {
542544
trace!("{}: recv {:?}", from, p);
543545

544-
let now = self.time.now();
546+
let now = RelativeTime::now();
545547

546548
if let Some(e) = self.admin_limit.get(from.ip()) {
547549
if e.is_valid(now, self.cfg.server.timeout.admin) {
@@ -601,7 +603,7 @@ impl<Addr: AddrExt> MasterServer<Addr> {
601603
}
602604
None => {
603605
warn!("{}: invalid admin hash, command: {:?}", from, p.command);
604-
self.admin_limit.insert(*from.ip(), Entry::new(now, ()));
606+
self.admin_limit.insert(*from.ip(), Entry::new(()));
605607
self.admin_limit_cleanup();
606608
}
607609
}
@@ -639,22 +641,22 @@ impl<Addr: AddrExt> MasterServer<Addr> {
639641

640642
fn add_challenge(&mut self, addr: Addr) -> u32 {
641643
let x = self.rng.u32(..);
642-
let entry = Entry::new(self.time.now(), x);
644+
let entry = Entry::new(x);
643645
self.challenges.insert(addr, entry);
644646
x
645647
}
646648

647649
fn remove_outdated_challenges(&mut self) {
648650
self.challenges.maybe_run(|map| {
649-
let now = self.time.now();
651+
let now = RelativeTime::now();
650652
map.retain(|_, v| v.is_valid(now, self.cfg.server.timeout.challenge));
651653
});
652654
}
653655

654656
fn admin_challenge_add(&mut self, addr: Addr) -> (u32, u32) {
655657
let x = self.rng.u32(..);
656658
let y = self.rng.u32(..);
657-
let entry = Entry::new(self.time.now(), (x, y));
659+
let entry = Entry::new((x, y));
658660
self.admin_challenges.insert(*addr.ip(), entry);
659661
(x, y)
660662
}
@@ -666,14 +668,14 @@ impl<Addr: AddrExt> MasterServer<Addr> {
666668
/// Remove outdated entries
667669
fn admin_challenges_cleanup(&mut self) {
668670
self.admin_challenges.maybe_run(|map| {
669-
let now = self.time.now();
671+
let now = RelativeTime::now();
670672
map.retain(|_, v| v.is_valid(now, self.cfg.server.timeout.challenge));
671673
});
672674
}
673675

674676
fn admin_limit_cleanup(&mut self) {
675677
self.admin_limit.maybe_run(|map| {
676-
let now = self.time.now();
678+
let now = RelativeTime::now();
677679
map.retain(|_, v| v.is_valid(now, self.cfg.server.timeout.admin));
678680
});
679681
}
@@ -683,26 +685,25 @@ impl<Addr: AddrExt> MasterServer<Addr> {
683685
}
684686

685687
fn add_server(&mut self, addr: Addr, server: ServerInfo) {
686-
let now = self.time.now();
687688
match self.servers.entry(addr) {
688689
hash_map::Entry::Occupied(mut e) => {
689690
trace!("{}: Updated GameServer", addr);
690-
e.insert(Entry::new(now, server));
691+
e.insert(Entry::new(server));
691692
}
692693
hash_map::Entry::Vacant(_) => {
693694
if self.count_servers(addr.ip()) >= self.cfg.server.max_servers_per_ip {
694695
trace!("{}: max servers per ip", addr);
695696
return;
696697
}
697698
trace!("{}: New GameServer", addr);
698-
self.servers.insert(addr, Entry::new(now, server));
699+
self.servers.insert(addr, Entry::new(server));
699700
}
700701
}
701702
}
702703

703704
fn remove_outdated_servers(&mut self) {
704705
self.servers.maybe_run(|map| {
705-
let now = self.time.now();
706+
let now = RelativeTime::now();
706707
map.retain(|_, v| v.is_valid(now, self.cfg.server.timeout.server));
707708
self.stats.servers_count(map.len());
708709
});

master/src/time.rs

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,24 @@
1-
use std::time::Instant;
1+
use std::{
2+
sync::OnceLock,
3+
time::{Duration, Instant},
4+
};
25

3-
pub struct RelativeTimer {
4-
start: Instant,
5-
}
6-
7-
impl RelativeTimer {
8-
pub fn new() -> Self {
9-
RelativeTimer {
10-
start: Instant::now(),
11-
}
12-
}
6+
/// A time relative to the startup of the program.
7+
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
8+
#[repr(transparent)]
9+
pub struct RelativeTime(u32);
1310

14-
pub fn now(&self) -> u32 {
15-
self.start.elapsed().as_secs() as u32
11+
impl RelativeTime {
12+
/// Returns current relative time.
13+
pub fn now() -> Self {
14+
static TIMER: OnceLock<Instant> = OnceLock::new();
15+
Self(TIMER.get_or_init(Instant::now).elapsed().as_secs() as u32)
1616
}
17-
}
1817

19-
impl Default for RelativeTimer {
20-
fn default() -> Self {
21-
Self::new()
18+
/// Returns the amount of time elapsed from another time to this one.
19+
///
20+
/// Returns zero if `earlier` is later than this time.
21+
pub fn duration_since(&self, earlier: Self) -> Duration {
22+
Duration::from_secs(self.0.saturating_sub(earlier.0) as u64)
2223
}
2324
}

protocol/src/filter.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -218,9 +218,9 @@ impl Filter<'_> {
218218
T: AsRef<[u8]>,
219219
{
220220
!((info.flags & self.flags_mask) != self.flags
221-
|| self.gamedir.map_or(false, |s| *s != info.gamedir.as_ref())
222-
|| self.map.map_or(false, |s| *s != info.map.as_ref())
223-
|| self.protocol.map_or(false, |s| s != info.protocol))
221+
|| self.gamedir.is_some_and(|s| *s != info.gamedir.as_ref())
222+
|| self.map.is_some_and(|s| *s != info.map.as_ref())
223+
|| self.protocol.is_some_and(|s| s != info.protocol))
224224
}
225225
}
226226

0 commit comments

Comments
 (0)