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
This commit is contained in:
Stephen Halter 2016-02-29 10:35:43 -08:00
parent 9c64a49261
commit 4e5920fd09
1 changed files with 21 additions and 15 deletions

View File

@ -35,7 +35,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel
private Queue<Work> _workRunning = new Queue<Work>(1024); private Queue<Work> _workRunning = new Queue<Work>(1024);
private Queue<CloseHandle> _closeHandleAdding = new Queue<CloseHandle>(256); private Queue<CloseHandle> _closeHandleAdding = new Queue<CloseHandle>(256);
private Queue<CloseHandle> _closeHandleRunning = new Queue<CloseHandle>(256); private Queue<CloseHandle> _closeHandleRunning = new Queue<CloseHandle>(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 _stopImmediate = false;
private bool _initCompleted = false; private bool _initCompleted = false;
private ExceptionDispatchInfo _closeError; private ExceptionDispatchInfo _closeError;
@ -83,11 +84,14 @@ namespace Microsoft.AspNetCore.Server.Kestrel
} }
public void Stop(TimeSpan timeout) public void Stop(TimeSpan timeout)
{
lock (_startSync)
{ {
if (!_initCompleted) if (!_initCompleted)
{ {
return; return;
} }
}
if (_thread.IsAlive) if (_thread.IsAlive)
{ {
@ -208,12 +212,15 @@ namespace Microsoft.AspNetCore.Server.Kestrel
} }
private void ThreadStart(object parameter) private void ThreadStart(object parameter)
{
lock (_startSync)
{ {
var tcs = (TaskCompletionSource<int>)parameter; var tcs = (TaskCompletionSource<int>)parameter;
try try
{ {
_loop.Init(_engine.Libuv); _loop.Init(_engine.Libuv);
_post.Init(_loop, OnPost, EnqueueCloseHandle); _post.Init(_loop, OnPost, EnqueueCloseHandle);
_initCompleted = true;
tcs.SetResult(0); tcs.SetResult(0);
} }
catch (Exception ex) catch (Exception ex)
@ -221,8 +228,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel
tcs.SetException(ex); tcs.SetException(ex);
return; return;
} }
}
_initCompleted = true;
try try
{ {