@@ -28,7 +28,7 @@ use xash3d_protocol::{
2828
2929use crate :: {
3030 config:: { Config , MasterConfig } ,
31- Periodic , RelativeTimer , Stats , StrArr ,
31+ Periodic , RelativeTime , Stats , StrArr ,
3232} ;
3333
3434type 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 ) ]
119119struct Entry < T > {
120- time : u32 ,
120+ time : RelativeTime ,
121121 value : T ,
122122}
123123
124124impl < 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>>;
212215pub 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 } ) ;
0 commit comments