@@ -9,7 +9,8 @@ use tokio::sync::{
99 mpsc:: { self , UnboundedReceiver , UnboundedSender } ,
1010} ;
1111
12- use super :: { EventAggregateHandler , EventHandler , FsEvent , FsEventKind } ;
12+ use super :: { EventAggregateHandler , EventHandler , FsEventKind } ;
13+ use crate :: watcher:: EventBatch ;
1314
1415type ThreadSafetyReceiver < T > = ThreadSafety < UnboundedReceiver < T > > ;
1516type ThreadSafety < T > = Arc < Mutex < T > > ;
@@ -32,7 +33,7 @@ impl FilesData {
3233/// deleted files, and coordinates the event handling logic.
3334pub struct Executor {
3435 aggregate_timeout : u32 ,
35- rx : ThreadSafety < UnboundedReceiver < FsEvent > > ,
36+ rx : ThreadSafetyReceiver < EventBatch > ,
3637 files_data : ThreadSafety < FilesData > ,
3738 exec_aggregate_tx : UnboundedSender < ExecAggregateEvent > ,
3839 exec_aggregate_rx : ThreadSafetyReceiver < ExecAggregateEvent > ,
@@ -59,13 +60,13 @@ enum ExecAggregateEvent {
5960}
6061
6162enum ExecEvent {
62- Execute ( FsEvent ) ,
63+ Execute ( EventBatch ) ,
6364 Close ,
6465}
6566
6667impl Executor {
6768 /// Create a new `WatcherExecutor` with the given receiver and optional aggregate timeout.
68- pub fn new ( rx : UnboundedReceiver < FsEvent > , aggregate_timeout : Option < u32 > ) -> Self {
69+ pub fn new ( rx : UnboundedReceiver < EventBatch > , aggregate_timeout : Option < u32 > ) -> Self {
6970 let ( exec_aggregate_tx, exec_aggregate_rx) = mpsc:: unbounded_channel :: < ExecAggregateEvent > ( ) ;
7071 let ( exec_tx, exec_rx) = mpsc:: unbounded_channel :: < ExecEvent > ( ) ;
7172
@@ -134,24 +135,27 @@ impl Executor {
134135 let aggregate_running = Arc :: clone ( & self . aggregate_running ) ;
135136
136137 let future = async move {
137- while let Some ( event) = rx. lock ( ) . await . recv ( ) . await {
138- let path = event. path . to_string_lossy ( ) . to_string ( ) ;
139- match event. kind {
140- FsEventKind :: Change => {
141- files_data. lock ( ) . await . changed . insert ( path) ;
142- }
143- FsEventKind :: Remove => {
144- files_data. lock ( ) . await . deleted . insert ( path) ;
145- }
146- FsEventKind :: Create => {
147- files_data. lock ( ) . await . changed . insert ( path) ;
138+ while let Some ( events) = rx. lock ( ) . await . recv ( ) . await {
139+ for event in & events {
140+ let path = event. path . to_string_lossy ( ) . to_string ( ) ;
141+ match event. kind {
142+ FsEventKind :: Change => {
143+ files_data. lock ( ) . await . changed . insert ( path) ;
144+ }
145+ FsEventKind :: Remove => {
146+ files_data. lock ( ) . await . deleted . insert ( path) ;
147+ }
148+ FsEventKind :: Create => {
149+ files_data. lock ( ) . await . changed . insert ( path) ;
150+ }
148151 }
149- } ;
152+ }
150153
151154 if !paused. load ( Ordering :: Relaxed ) && !aggregate_running. load ( Ordering :: Relaxed ) {
152155 let _ = exec_aggregate_tx. send ( ExecAggregateEvent :: Execute ) ;
153156 }
154- let _ = exec_tx. send ( ExecEvent :: Execute ( event) ) ;
157+
158+ let _ = exec_tx. send ( ExecEvent :: Execute ( events) ) ;
155159 }
156160
157161 let _ = exec_aggregate_tx. send ( ExecAggregateEvent :: Close ) ;
@@ -194,19 +198,22 @@ fn create_execute_task(
194198 exec_rx : ThreadSafetyReceiver < ExecEvent > ,
195199) -> tokio:: task:: JoinHandle < ( ) > {
196200 let future = async move {
197- while let Some ( event) = exec_rx. lock ( ) . await . recv ( ) . await {
198- match event {
199- ExecEvent :: Execute ( event) => {
200- let path = event. path . to_string_lossy ( ) . to_string ( ) ;
201- match event. kind {
202- super :: FsEventKind :: Change | super :: FsEventKind :: Create => {
203- if event_handler. on_change ( path) . is_err ( ) {
204- break ;
201+ while let Some ( exec_event) = exec_rx. lock ( ) . await . recv ( ) . await {
202+ match exec_event {
203+ ExecEvent :: Execute ( batch_events) => {
204+ for event in batch_events {
205+ // Handle each event based on its kind
206+ let path = event. path . to_string_lossy ( ) . to_string ( ) ;
207+ match event. kind {
208+ super :: FsEventKind :: Change | super :: FsEventKind :: Create => {
209+ if event_handler. on_change ( path) . is_err ( ) {
210+ break ;
211+ }
205212 }
206- }
207- super :: FsEventKind :: Remove => {
208- if event_handler . on_delete ( path ) . is_err ( ) {
209- break ;
213+ super :: FsEventKind :: Remove => {
214+ if event_handler . on_delete ( path ) . is_err ( ) {
215+ break ;
216+ }
210217 }
211218 }
212219 }
0 commit comments