Shorter LibuvThread locks (#2034)

This commit is contained in:
Ben Adams 2017-08-29 20:21:45 +01:00 committed by Stephen Halter
parent 5bf7d3b28a
commit e7743cbb78
1 changed files with 22 additions and 16 deletions

View File

@ -32,6 +32,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv.Internal
private Queue<CloseHandle> _closeHandleAdding = new Queue<CloseHandle>(256); private Queue<CloseHandle> _closeHandleAdding = new Queue<CloseHandle>(256);
private Queue<CloseHandle> _closeHandleRunning = new Queue<CloseHandle>(256); private Queue<CloseHandle> _closeHandleRunning = new Queue<CloseHandle>(256);
private readonly object _workSync = new object(); private readonly object _workSync = new object();
private readonly object _closeHandleSync = new object();
private readonly object _startSync = new object(); private readonly object _startSync = new object();
private bool _stopImmediate = false; private bool _stopImmediate = false;
private bool _initCompleted = false; private bool _initCompleted = false;
@ -170,14 +171,16 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv.Internal
public void Post<T>(Action<T> callback, T state) public void Post<T>(Action<T> callback, T state)
{ {
var work = new Work
{
CallbackAdapter = CallbackAdapter<T>.PostCallbackAdapter,
Callback = callback,
State = state
};
lock (_workSync) lock (_workSync)
{ {
_workAdding.Enqueue(new Work _workAdding.Enqueue(work);
{
CallbackAdapter = CallbackAdapter<T>.PostCallbackAdapter,
Callback = callback,
State = state
});
} }
_post.Send(); _post.Send();
} }
@ -190,15 +193,17 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv.Internal
public Task PostAsync<T>(Action<T> callback, T state) public Task PostAsync<T>(Action<T> callback, T state)
{ {
var tcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously); var tcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
var work = new Work
{
CallbackAdapter = CallbackAdapter<T>.PostAsyncCallbackAdapter,
Callback = callback,
State = state,
Completion = tcs
};
lock (_workSync) lock (_workSync)
{ {
_workAdding.Enqueue(new Work _workAdding.Enqueue(work);
{
CallbackAdapter = CallbackAdapter<T>.PostAsyncCallbackAdapter,
Callback = callback,
State = state,
Completion = tcs
});
} }
_post.Send(); _post.Send();
return tcs.Task; return tcs.Task;
@ -226,9 +231,10 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv.Internal
private void EnqueueCloseHandle(Action<IntPtr> callback, IntPtr handle) private void EnqueueCloseHandle(Action<IntPtr> 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() private bool DoPostCloseHandle()
{ {
Queue<CloseHandle> queue; Queue<CloseHandle> queue;
lock (_workSync) lock (_closeHandleSync)
{ {
queue = _closeHandleAdding; queue = _closeHandleAdding;
_closeHandleAdding = _closeHandleRunning; _closeHandleAdding = _closeHandleRunning;