Trim exposed KestrelThread api
This commit is contained in:
parent
2ac5e4c790
commit
d82c571831
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue