@@ -18,6 +18,11 @@ namespace Microsoft.AspNet.Server.Kestrel
18
18
/// </summary>
19
19
public class KestrelThread
20
20
{
21
+ // maximum times the work queues swapped and are processed in a single pass
22
+ // as completing a task may immediately have write data to put on the network
23
+ // otherwise it needs to wait till the next pass of the libuv loop
24
+ private const int _maxLoops = 8 ;
25
+
21
26
private static Action < object , object > _threadCallbackAdapter = ( callback , state ) => ( ( Action < KestrelThread > ) callback ) . Invoke ( ( KestrelThread ) state ) ;
22
27
private KestrelEngine _engine ;
23
28
private readonly IApplicationLifetime _appLifetime ;
@@ -249,11 +254,17 @@ private void ThreadStart(object parameter)
249
254
250
255
private void OnPost ( )
251
256
{
252
- DoPostWork ( ) ;
253
- DoPostCloseHandle ( ) ;
257
+ var loopsRemaining = _maxLoops ;
258
+ bool wasWork ;
259
+ do
260
+ {
261
+ wasWork = DoPostWork ( ) ;
262
+ wasWork = DoPostCloseHandle ( ) || wasWork ;
263
+ loopsRemaining -- ;
264
+ } while ( wasWork && loopsRemaining > 0 ) ;
254
265
}
255
266
256
- private void DoPostWork ( )
267
+ private bool DoPostWork ( )
257
268
{
258
269
Queue < Work > queue ;
259
270
lock ( _workSync )
@@ -262,6 +273,9 @@ private void DoPostWork()
262
273
_workAdding = _workRunning ;
263
274
_workRunning = queue ;
264
275
}
276
+
277
+ bool wasWork = queue . Count > 0 ;
278
+
265
279
while ( queue . Count != 0 )
266
280
{
267
281
var work = queue . Dequeue ( ) ;
@@ -286,8 +300,10 @@ private void DoPostWork()
286
300
}
287
301
}
288
302
}
303
+
304
+ return wasWork ;
289
305
}
290
- private void DoPostCloseHandle ( )
306
+ private bool DoPostCloseHandle ( )
291
307
{
292
308
Queue < CloseHandle > queue ;
293
309
lock ( _workSync )
@@ -296,6 +312,9 @@ private void DoPostCloseHandle()
296
312
_closeHandleAdding = _closeHandleRunning ;
297
313
_closeHandleRunning = queue ;
298
314
}
315
+
316
+ bool wasWork = queue . Count > 0 ;
317
+
299
318
while ( queue . Count != 0 )
300
319
{
301
320
var closeHandle = queue . Dequeue ( ) ;
@@ -309,6 +328,8 @@ private void DoPostCloseHandle()
309
328
throw ;
310
329
}
311
330
}
331
+
332
+ return wasWork ;
312
333
}
313
334
314
335
private struct Work
0 commit comments