From 4e5920fd09eb2deb4acb04f1054f9026cb7e4d3a Mon Sep 17 00:00:00 2001 From: Stephen Halter Date: Mon, 29 Feb 2016 10:35:43 -0800 Subject: [PATCH] KestrelThread.Stop should wait for StartAsync to complete - Previously KestrelThread.Stop might assume start failed prematurely - This could cause a background thread to run indefinitely in the background --- .../Infrastructure/KestrelThread.cs | 36 +++++++++++-------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Infrastructure/KestrelThread.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Infrastructure/KestrelThread.cs index d8cb804fbb..2b6d2ab0a5 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Infrastructure/KestrelThread.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Infrastructure/KestrelThread.cs @@ -35,7 +35,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel private Queue _workRunning = new Queue(1024); private Queue _closeHandleAdding = new Queue(256); private Queue _closeHandleRunning = new Queue(256); - private readonly object _workSync = new Object(); + private readonly object _workSync = new object(); + private readonly object _startSync = new object(); private bool _stopImmediate = false; private bool _initCompleted = false; private ExceptionDispatchInfo _closeError; @@ -84,9 +85,12 @@ namespace Microsoft.AspNetCore.Server.Kestrel public void Stop(TimeSpan timeout) { - if (!_initCompleted) + lock (_startSync) { - return; + if (!_initCompleted) + { + return; + } } if (_thread.IsAlive) @@ -209,20 +213,22 @@ namespace Microsoft.AspNetCore.Server.Kestrel private void ThreadStart(object parameter) { - var tcs = (TaskCompletionSource)parameter; - try + lock (_startSync) { - _loop.Init(_engine.Libuv); - _post.Init(_loop, OnPost, EnqueueCloseHandle); - tcs.SetResult(0); + var tcs = (TaskCompletionSource)parameter; + try + { + _loop.Init(_engine.Libuv); + _post.Init(_loop, OnPost, EnqueueCloseHandle); + _initCompleted = true; + tcs.SetResult(0); + } + catch (Exception ex) + { + tcs.SetException(ex); + return; + } } - catch (Exception ex) - { - tcs.SetException(ex); - return; - } - - _initCompleted = true; try {