@@ -62,24 +62,31 @@ pub struct StatsTracker {
6262}
6363
6464impl StatsTracker {
65- pub fn new_active_instance ( ) -> Self {
66- Self :: new_instance ( true )
67- }
65+ pub fn new_active_instance ( ) -> ( Self , StatsEventSender ) {
66+ let mut stats_tracker = Self {
67+ channel_sender : None ,
68+ stats : Arc :: new ( RwLock :: new ( TrackerStatistics :: new ( ) ) ) ,
69+ } ;
6870
69- pub fn new_inactive_instance ( ) -> Self {
70- Self :: new_instance ( false )
71+ let stats_event_sender = stats_tracker. run_worker ( ) ;
72+
73+ ( stats_tracker, stats_event_sender)
7174 }
7275
73- pub fn new_instance ( active : bool ) -> Self {
74- let mut stats_tracker = Self {
76+ pub fn new_inactive_instance ( ) -> Self {
77+ Self {
7578 channel_sender : None ,
7679 stats : Arc :: new ( RwLock :: new ( TrackerStatistics :: new ( ) ) ) ,
77- } ;
80+ }
81+ }
7882
79- if active {
80- stats_tracker. run_worker ( ) ;
83+ pub fn new_instance ( active : bool ) -> Self {
84+ if !active {
85+ return Self :: new_inactive_instance ( ) ;
8186 }
8287
88+ let ( stats_tracker, _stats_event_sender) = Self :: new_active_instance ( ) ;
89+
8390 stats_tracker
8491 }
8592
@@ -90,11 +97,11 @@ impl StatsTracker {
9097 }
9198 }
9299
93- pub fn run_worker ( & mut self ) {
100+ pub fn run_worker ( & mut self ) -> StatsEventSender {
94101 let ( tx, mut rx) = mpsc:: channel :: < TrackerStatisticsEvent > ( CHANNEL_BUFFER_SIZE ) ;
95102
96103 // set send channel on stats_tracker
97- self . channel_sender = Some ( tx) ;
104+ self . channel_sender = Some ( tx. clone ( ) ) ;
98105
99106 let stats = self . stats . clone ( ) ;
100107
@@ -142,6 +149,8 @@ impl StatsTracker {
142149 drop ( stats_lock) ;
143150 }
144151 } ) ;
152+
153+ StatsEventSender { sender : tx }
145154 }
146155}
147156
@@ -161,6 +170,17 @@ impl TrackerStatisticsEventSender for StatsTracker {
161170 }
162171}
163172
173+ pub struct StatsEventSender {
174+ sender : Sender < TrackerStatisticsEvent > ,
175+ }
176+
177+ #[ async_trait]
178+ impl TrackerStatisticsEventSender for StatsEventSender {
179+ async fn send_event ( & self , event : TrackerStatisticsEvent ) -> Option < Result < ( ) , SendError < TrackerStatisticsEvent > > > {
180+ Some ( self . sender . send ( event) . await )
181+ }
182+ }
183+
164184#[ async_trait]
165185pub trait TrackerStatisticsRepository : Sync + Send {
166186 async fn get_stats ( & self ) -> RwLockReadGuard < ' _ , TrackerStatistics > ;
0 commit comments