From d82c5718310933259fefb5dd97c939b7331d0932 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Wed, 11 Nov 2015 11:43:37 +0000 Subject: [PATCH 1/2] Trim exposed KestrelThread api --- .../Http/ListenerSecondary.cs | 3 +- .../Infrastructure/KestrelThread.cs | 56 ++++++++----------- 2 files changed, 23 insertions(+), 36 deletions(-) diff --git a/src/Microsoft.AspNet.Server.Kestrel/Http/ListenerSecondary.cs b/src/Microsoft.AspNet.Server.Kestrel/Http/ListenerSecondary.cs index 5891df44ca..0bc8fae781 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Http/ListenerSecondary.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Http/ListenerSecondary.cs @@ -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); diff --git a/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/KestrelThread.cs b/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/KestrelThread.cs index a8608de70f..4084e175d8 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/KestrelThread.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/KestrelThread.cs @@ -18,7 +18,7 @@ namespace Microsoft.AspNet.Server.Kestrel /// public class KestrelThread { - private static Action _objectCallbackAdapter = (callback, state) => ((Action)callback).Invoke(state); + private static Action _threadCallbackAdapter = (callback, state) => ((Action)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) => OnStop(t)); if (!_thread.Join((int)timeout.TotalMilliseconds)) { try { - Post(OnStopRude, null); + Post((t) => OnStopRude(t)); if (!_thread.Join((int)timeout.TotalMilliseconds)) { - Post(OnStopImmediate, null); + Post((t) => OnStopImmediate(t)); if (!_thread.Join((int)timeout.TotalMilliseconds)) { #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( - _loop, + thread._engine.Libuv.walk( + thread._loop, (ptr, arg) => { var handle = UvMemory.FromIntPtr(ptr); - if (handle != _post) + if (handle != thread._post) { handle.Dispose(); } @@ -120,17 +120,17 @@ namespace Microsoft.AspNet.Server.Kestrel IntPtr.Zero); } - private void OnStopImmediate(object obj) + private static void OnStopImmediate(KestrelThread thread) { - _stopImmediate = true; - _loop.Stop(); + thread._stopImmediate = true; + thread._loop.Stop(); } - public void Post(Action callback, object state) + private void Post(Action 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 callback, object state) - { - var tcs = new TaskCompletionSource(); - lock (_workSync) - { - _workAdding.Enqueue(new Work - { - CallbackAdapter = _objectCallbackAdapter, - Callback = callback, - State = state, - Completion = tcs - }); - } - _post.Send(); - return tcs.Task; - } - public Task PostAsync(Action callback, T state) { var tcs = new TaskCompletionSource(); @@ -183,7 +166,7 @@ namespace Microsoft.AspNet.Server.Kestrel return tcs.Task; } - public void Send(Action callback, object state) + public void Send(Action 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)tcs).SetException(ex); + }, + work.Completion); } else { From 558b0ae643eca5f616ad288c0022d46419a5b970 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Fri, 13 Nov 2015 13:04:21 +0000 Subject: [PATCH 2/2] statics to instance --- .../Infrastructure/KestrelThread.cs | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/KestrelThread.cs b/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/KestrelThread.cs index 4084e175d8..93c30a55dd 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/KestrelThread.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/KestrelThread.cs @@ -64,15 +64,15 @@ namespace Microsoft.AspNet.Server.Kestrel return; } - Post((t) => OnStop(t)); + Post(t => t.OnStop()); if (!_thread.Join((int)timeout.TotalMilliseconds)) { try { - Post((t) => OnStopRude(t)); + Post(t => t.OnStopRude()); if (!_thread.Join((int)timeout.TotalMilliseconds)) { - Post((t) => OnStopImmediate(t)); + Post(t => t.OnStopImmediate()); if (!_thread.Join((int)timeout.TotalMilliseconds)) { #if NET451 @@ -100,19 +100,19 @@ namespace Microsoft.AspNet.Server.Kestrel } } - private static void OnStop(KestrelThread thread) + private void OnStop() { - thread._post.Unreference(); + _post.Unreference(); } - private static void OnStopRude(KestrelThread thread) + private void OnStopRude() { - thread._engine.Libuv.walk( - thread._loop, + _engine.Libuv.walk( + _loop, (ptr, arg) => { var handle = UvMemory.FromIntPtr(ptr); - if (handle != thread._post) + if (handle != _post) { handle.Dispose(); } @@ -120,10 +120,10 @@ namespace Microsoft.AspNet.Server.Kestrel IntPtr.Zero); } - private static void OnStopImmediate(KestrelThread thread) + private void OnStopImmediate() { - thread._stopImmediate = true; - thread._loop.Stop(); + _stopImmediate = true; + _loop.Stop(); } private void Post(Action callback)