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.
if (Thread.FatalError == null)
{
Thread.Send(state =>
Thread.Send(listener =>
{
var listener = (ListenerSecondary)state;
listener.DispatchPipe.Dispose();
listener.FreeBuffer();
}, this);

View File

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