@@ -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 > _objectCallbackAdapter = ( callback , state ) => ( ( Action < object > ) callback ) . Invoke ( state ) ;
22
27
private KestrelEngine _engine ;
23
28
private readonly IApplicationLifetime _appLifetime ;
@@ -262,11 +267,17 @@ private void ThreadStart(object parameter)
262
267
263
268
private void OnPost ( )
264
269
{
265
- DoPostWork ( ) ;
266
- DoPostCloseHandle ( ) ;
270
+ var loopsRemaining = _maxLoops ;
271
+ bool wasWork = true ;
272
+ do
273
+ {
274
+ wasWork = DoPostWork ( ) ;
275
+ wasWork = DoPostCloseHandle ( ) || wasWork ;
276
+ loopsRemaining -- ;
277
+ } while ( wasWork && loopsRemaining > 0 ) ;
267
278
}
268
279
269
- private void DoPostWork ( )
280
+ private bool DoPostWork ( )
270
281
{
271
282
Queue < Work > queue ;
272
283
lock ( _workSync )
@@ -275,6 +286,9 @@ private void DoPostWork()
275
286
_workAdding = _workRunning ;
276
287
_workRunning = queue ;
277
288
}
289
+
290
+ bool wasWork = queue . Count > 0 ;
291
+
278
292
while ( queue . Count != 0 )
279
293
{
280
294
var work = queue . Dequeue ( ) ;
@@ -304,8 +318,10 @@ private void DoPostWork()
304
318
}
305
319
}
306
320
}
321
+
322
+ return wasWork ;
307
323
}
308
- private void DoPostCloseHandle ( )
324
+ private bool DoPostCloseHandle ( )
309
325
{
310
326
Queue < CloseHandle > queue ;
311
327
lock ( _workSync )
@@ -314,6 +330,9 @@ private void DoPostCloseHandle()
314
330
_closeHandleAdding = _closeHandleRunning ;
315
331
_closeHandleRunning = queue ;
316
332
}
333
+
334
+ bool wasWork = queue . Count > 0 ;
335
+
317
336
while ( queue . Count != 0 )
318
337
{
319
338
var closeHandle = queue . Dequeue ( ) ;
@@ -327,6 +346,8 @@ private void DoPostCloseHandle()
327
346
throw ;
328
347
}
329
348
}
349
+
350
+ return wasWork ;
330
351
}
331
352
332
353
private struct Work
0 commit comments