Merge branch 'benaadams/kestrel-thread-api' into dev

This commit is contained in:
Stephen Halter 2015-12-01 12:20:41 -08:00
commit 0c33cad343
2 changed files with 17 additions and 30 deletions

View File

@ -165,9 +165,8 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
// the exception that stopped the event loop will never be surfaced. // the exception that stopped the event loop will never be surfaced.
if (Thread.FatalError == null) if (Thread.FatalError == null)
{ {
Thread.Send(state => Thread.Send(listener =>
{ {
var listener = (ListenerSecondary)state;
listener.DispatchPipe.Dispose(); listener.DispatchPipe.Dispose();
listener.FreeBuffer(); listener.FreeBuffer();
}, this); }, this);

View File

@ -18,7 +18,7 @@ namespace Microsoft.AspNet.Server.Kestrel
/// </summary> /// </summary>
public class KestrelThread public class KestrelThread
{ {
private static Action<object, object> _objectCallbackAdapter = (callback, state) => ((Action<object>)callback).Invoke(state); private static Action<object, object> _threadCallbackAdapter = (callback, state) => ((Action<KestrelThread>)callback).Invoke((KestrelThread)state);
private KestrelEngine _engine; private KestrelEngine _engine;
private readonly IApplicationLifetime _appLifetime; private readonly IApplicationLifetime _appLifetime;
private Thread _thread; private Thread _thread;
@ -64,15 +64,15 @@ namespace Microsoft.AspNet.Server.Kestrel
return; return;
} }
Post(OnStop, null); Post(t => t.OnStop());
if (!_thread.Join((int)timeout.TotalMilliseconds)) if (!_thread.Join((int)timeout.TotalMilliseconds))
{ {
try try
{ {
Post(OnStopRude, null); Post(t => t.OnStopRude());
if (!_thread.Join((int)timeout.TotalMilliseconds)) if (!_thread.Join((int)timeout.TotalMilliseconds))
{ {
Post(OnStopImmediate, null); Post(t => t.OnStopImmediate());
if (!_thread.Join((int)timeout.TotalMilliseconds)) if (!_thread.Join((int)timeout.TotalMilliseconds))
{ {
#if NET451 #if NET451
@ -100,12 +100,12 @@ namespace Microsoft.AspNet.Server.Kestrel
} }
} }
private void OnStop(object obj) private void OnStop()
{ {
_post.Unreference(); _post.Unreference();
} }
private void OnStopRude(object obj) private void OnStopRude()
{ {
_engine.Libuv.walk( _engine.Libuv.walk(
_loop, _loop,
@ -120,17 +120,17 @@ namespace Microsoft.AspNet.Server.Kestrel
IntPtr.Zero); IntPtr.Zero);
} }
private void OnStopImmediate(object obj) private void OnStopImmediate()
{ {
_stopImmediate = true; _stopImmediate = true;
_loop.Stop(); _loop.Stop();
} }
public void Post(Action<object> callback, object state) private void Post(Action<KestrelThread> callback)
{ {
lock (_workSync) lock (_workSync)
{ {
_workAdding.Enqueue(new Work { CallbackAdapter = _objectCallbackAdapter, Callback = callback, State = state }); _workAdding.Enqueue(new Work { CallbackAdapter = _threadCallbackAdapter, Callback = callback, State = this });
} }
_post.Send(); _post.Send();
} }
@ -149,23 +149,6 @@ namespace Microsoft.AspNet.Server.Kestrel
_post.Send(); _post.Send();
} }
public Task PostAsync(Action<object> callback, object state)
{
var tcs = new TaskCompletionSource<int>();
lock (_workSync)
{
_workAdding.Enqueue(new Work
{
CallbackAdapter = _objectCallbackAdapter,
Callback = callback,
State = state,
Completion = tcs
});
}
_post.Send();
return tcs.Task;
}
public Task PostAsync<T>(Action<T> callback, T state) public Task PostAsync<T>(Action<T> callback, T state)
{ {
var tcs = new TaskCompletionSource<int>(); var tcs = new TaskCompletionSource<int>();
@ -183,7 +166,7 @@ namespace Microsoft.AspNet.Server.Kestrel
return tcs.Task; return tcs.Task;
} }
public void Send(Action<object> callback, object state) public void Send<T>(Action<T> callback, T state)
{ {
if (_loop.ThreadId == Thread.CurrentThread.ManagedThreadId) if (_loop.ThreadId == Thread.CurrentThread.ManagedThreadId)
{ {
@ -295,7 +278,12 @@ namespace Microsoft.AspNet.Server.Kestrel
{ {
if (work.Completion != null) if (work.Completion != null)
{ {
ThreadPool.QueueUserWorkItem(_ => work.Completion.SetException(ex), null); ThreadPool.QueueUserWorkItem(
tcs =>
{
((TaskCompletionSource<int>)tcs).SetException(ex);
},
work.Completion);
} }
else else
{ {