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> _closeHandleRunning = new Queue<CloseHandle>(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<T>(Action<T> callback, T state)
{
var work = new Work
{
CallbackAdapter = CallbackAdapter<T>.PostCallbackAdapter,
Callback = callback,
State = state
};
lock (_workSync)
{
_workAdding.Enqueue(new Work
{
CallbackAdapter = CallbackAdapter<T>.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<T>(Action<T> callback, T state)
{
var tcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
var work = new Work
{
CallbackAdapter = CallbackAdapter<T>.PostAsyncCallbackAdapter,
Callback = callback,
State = state,
Completion = tcs
};
lock (_workSync)
{
_workAdding.Enqueue(new Work
{
CallbackAdapter = CallbackAdapter<T>.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<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()
{
Queue<CloseHandle> queue;
lock (_workSync)
lock (_closeHandleSync)
{
queue = _closeHandleAdding;
_closeHandleAdding = _closeHandleRunning;