Merge branch 'benaadams/kestrel-thread-api' into dev
This commit is contained in:
commit
0c33cad343
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue