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