@@ -9,7 +9,8 @@ use tokio::sync::{
9
9
mpsc:: { self , UnboundedReceiver , UnboundedSender } ,
10
10
} ;
11
11
12
- use super :: { EventAggregateHandler , EventHandler , FsEvent , FsEventKind } ;
12
+ use super :: { EventAggregateHandler , EventHandler , FsEventKind } ;
13
+ use crate :: watcher:: EventBatch ;
13
14
14
15
type ThreadSafetyReceiver < T > = ThreadSafety < UnboundedReceiver < T > > ;
15
16
type ThreadSafety < T > = Arc < Mutex < T > > ;
@@ -32,7 +33,7 @@ impl FilesData {
32
33
/// deleted files, and coordinates the event handling logic.
33
34
pub struct Executor {
34
35
aggregate_timeout : u32 ,
35
- rx : ThreadSafety < UnboundedReceiver < FsEvent > > ,
36
+ rx : ThreadSafetyReceiver < EventBatch > ,
36
37
files_data : ThreadSafety < FilesData > ,
37
38
exec_aggregate_tx : UnboundedSender < ExecAggregateEvent > ,
38
39
exec_aggregate_rx : ThreadSafetyReceiver < ExecAggregateEvent > ,
@@ -59,13 +60,13 @@ enum ExecAggregateEvent {
59
60
}
60
61
61
62
enum ExecEvent {
62
- Execute ( FsEvent ) ,
63
+ Execute ( EventBatch ) ,
63
64
Close ,
64
65
}
65
66
66
67
impl Executor {
67
68
/// 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 {
69
70
let ( exec_aggregate_tx, exec_aggregate_rx) = mpsc:: unbounded_channel :: < ExecAggregateEvent > ( ) ;
70
71
let ( exec_tx, exec_rx) = mpsc:: unbounded_channel :: < ExecEvent > ( ) ;
71
72
@@ -134,24 +135,27 @@ impl Executor {
134
135
let aggregate_running = Arc :: clone ( & self . aggregate_running ) ;
135
136
136
137
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
+ }
148
151
}
149
- } ;
152
+ }
150
153
151
154
if !paused. load ( Ordering :: Relaxed ) && !aggregate_running. load ( Ordering :: Relaxed ) {
152
155
let _ = exec_aggregate_tx. send ( ExecAggregateEvent :: Execute ) ;
153
156
}
154
- let _ = exec_tx. send ( ExecEvent :: Execute ( event) ) ;
157
+
158
+ let _ = exec_tx. send ( ExecEvent :: Execute ( events) ) ;
155
159
}
156
160
157
161
let _ = exec_aggregate_tx. send ( ExecAggregateEvent :: Close ) ;
@@ -194,19 +198,22 @@ fn create_execute_task(
194
198
exec_rx : ThreadSafetyReceiver < ExecEvent > ,
195
199
) -> tokio:: task:: JoinHandle < ( ) > {
196
200
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
+ }
205
212
}
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
+ }
210
217
}
211
218
}
212
219
}
0 commit comments