@@ -9,7 +9,7 @@ import { ILogMessage, IRecursiveWatcherWithSubscribe, IUniversalWatchRequest, IW
9
9
import { Emitter , Event } from 'vs/base/common/event' ;
10
10
import { FileChangeType , IFileChange } from 'vs/platform/files/common/files' ;
11
11
import { URI } from 'vs/base/common/uri' ;
12
- import { DeferredPromise } from 'vs/base/common/async' ;
12
+ import { DeferredPromise , ThrottledDelayer } from 'vs/base/common/async' ;
13
13
14
14
export abstract class BaseWatcher extends Disposable implements IWatcher {
15
15
@@ -28,6 +28,8 @@ export abstract class BaseWatcher extends Disposable implements IWatcher {
28
28
private readonly suspendedWatchRequests = this . _register ( new DisposableMap < number /* correlation ID */ > ( ) ) ;
29
29
private readonly suspendedWatchRequestsWithPolling = new Set < number /* correlation ID */ > ( ) ;
30
30
31
+ private readonly updateWatchersDelayer = this . _register ( new ThrottledDelayer < void > ( this . getUpdateWatchersDelay ( ) ) ) ;
32
+
31
33
protected readonly suspendedWatchRequestPollingInterval : number = 5007 ; // node.js default
32
34
33
35
private joinWatch = new DeferredPromise < void > ( ) ;
@@ -88,17 +90,21 @@ export abstract class BaseWatcher extends Disposable implements IWatcher {
88
90
}
89
91
}
90
92
91
- return await this . updateWatchers ( ) ;
93
+ return await this . updateWatchers ( false /* not delayed */ ) ;
92
94
} finally {
93
95
this . joinWatch . complete ( ) ;
94
96
}
95
97
}
96
98
97
- private updateWatchers ( ) : Promise < void > {
98
- return this . doWatch ( [
99
+ private updateWatchers ( delayed : boolean ) : Promise < void > {
100
+ return this . updateWatchersDelayer . trigger ( ( ) => this . doWatch ( [
99
101
...this . allNonCorrelatedWatchRequests ,
100
102
...Array . from ( this . allCorrelatedWatchRequests . values ( ) ) . filter ( request => ! this . suspendedWatchRequests . has ( request . correlationId ) )
101
- ] ) ;
103
+ ] ) , delayed ? this . getUpdateWatchersDelay ( ) : 0 ) ;
104
+ }
105
+
106
+ protected getUpdateWatchersDelay ( ) : number {
107
+ return 800 ;
102
108
}
103
109
104
110
isSuspended ( request : IUniversalWatchRequest ) : 'polling' | boolean {
@@ -130,14 +136,14 @@ export abstract class BaseWatcher extends Disposable implements IWatcher {
130
136
131
137
this . monitorSuspendedWatchRequest ( request , disposables ) ;
132
138
133
- this . updateWatchers ( ) ;
139
+ this . updateWatchers ( true /* delay this call as we might accumulate many failing watch requests on startup */ ) ;
134
140
}
135
141
136
142
private resumeWatchRequest ( request : IWatchRequestWithCorrelation ) : void {
137
143
this . suspendedWatchRequests . deleteAndDispose ( request . correlationId ) ;
138
144
this . suspendedWatchRequestsWithPolling . delete ( request . correlationId ) ;
139
145
140
- this . updateWatchers ( ) ;
146
+ this . updateWatchers ( false ) ;
141
147
}
142
148
143
149
private monitorSuspendedWatchRequest ( request : IWatchRequestWithCorrelation , disposables : DisposableStore ) : void {
0 commit comments