Trim exposed KestrelThread api

This commit is contained in:
Ben Adams 2015-11-11 11:43:37 +00:00
parent 2ac5e4c790
commit d82c571831
2 changed files with 23 additions and 36 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) => OnStop(t));
if (!_thread.Join((int)timeout.TotalMilliseconds)) if (!_thread.Join((int)timeout.TotalMilliseconds))
{ {
try try
{ {
Post(OnStopRude, null); Post((t) => OnStopRude(t));
if (!_thread.Join((int)timeout.TotalMilliseconds)) if (!_thread.Join((int)timeout.TotalMilliseconds))
{ {
Post(OnStopImmediate, null); Post((t) => OnStopImmediate(t));
if (!_thread.Join((int)timeout.TotalMilliseconds)) if (!_thread.Join((int)timeout.TotalMilliseconds))
{ {
#if NET451 #if NET451
@ -100,19 +100,19 @@ namespace Microsoft.AspNet.Server.Kestrel
} }
} }
private void OnStop(object obj) private static void OnStop(KestrelThread thread)
{ {
_post.Unreference(); thread._post.Unreference();
} }
private void OnStopRude(object obj) private static void OnStopRude(KestrelThread thread)
{ {
_engine.Libuv.walk( thread._engine.Libuv.walk(
_loop, thread._loop,
(ptr, arg) => (ptr, arg) =>
{ {
var handle = UvMemory.FromIntPtr<UvHandle>(ptr); var handle = UvMemory.FromIntPtr<UvHandle>(ptr);
if (handle != _post) if (handle != thread._post)
{ {
handle.Dispose(); handle.Dispose();
} }
@ -120,17 +120,17 @@ namespace Microsoft.AspNet.Server.Kestrel
IntPtr.Zero); IntPtr.Zero);
} }
private void OnStopImmediate(object obj) private static void OnStopImmediate(KestrelThread thread)
{ {
_stopImmediate = true; thread._stopImmediate = true;
_loop.Stop(); thread._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
{ {