From e7743cbb78cac6d01b90a0d718cf043663688bb1 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Tue, 29 Aug 2017 20:21:45 +0100 Subject: [PATCH] Shorter LibuvThread locks (#2034) --- .../Internal/LibuvThread.cs | 38 +++++++++++-------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/src/Kestrel.Transport.Libuv/Internal/LibuvThread.cs b/src/Kestrel.Transport.Libuv/Internal/LibuvThread.cs index 6b27b447ea..726f3bfb6a 100644 --- a/src/Kestrel.Transport.Libuv/Internal/LibuvThread.cs +++ b/src/Kestrel.Transport.Libuv/Internal/LibuvThread.cs @@ -32,6 +32,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv.Internal private Queue _closeHandleAdding = new Queue(256); private Queue _closeHandleRunning = new Queue(256); private readonly object _workSync = new object(); + private readonly object _closeHandleSync = new object(); private readonly object _startSync = new object(); private bool _stopImmediate = false; private bool _initCompleted = false; @@ -170,14 +171,16 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv.Internal public void Post(Action callback, T state) { + var work = new Work + { + CallbackAdapter = CallbackAdapter.PostCallbackAdapter, + Callback = callback, + State = state + }; + lock (_workSync) { - _workAdding.Enqueue(new Work - { - CallbackAdapter = CallbackAdapter.PostCallbackAdapter, - Callback = callback, - State = state - }); + _workAdding.Enqueue(work); } _post.Send(); } @@ -190,15 +193,17 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv.Internal public Task PostAsync(Action callback, T state) { var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + var work = new Work + { + CallbackAdapter = CallbackAdapter.PostAsyncCallbackAdapter, + Callback = callback, + State = state, + Completion = tcs + }; + lock (_workSync) { - _workAdding.Enqueue(new Work - { - CallbackAdapter = CallbackAdapter.PostAsyncCallbackAdapter, - Callback = callback, - State = state, - Completion = tcs - }); + _workAdding.Enqueue(work); } _post.Send(); return tcs.Task; @@ -226,9 +231,10 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv.Internal private void EnqueueCloseHandle(Action callback, IntPtr handle) { - lock (_workSync) + var closeHandle = new CloseHandle { Callback = callback, Handle = handle }; + lock (_closeHandleSync) { - _closeHandleAdding.Enqueue(new CloseHandle { Callback = callback, Handle = handle }); + _closeHandleAdding.Enqueue(closeHandle); } } @@ -352,7 +358,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv.Internal private bool DoPostCloseHandle() { Queue queue; - lock (_workSync) + lock (_closeHandleSync) { queue = _closeHandleAdding; _closeHandleAdding = _closeHandleRunning;