Shorter LibuvThread locks (#2034)
This commit is contained in:
parent
5bf7d3b28a
commit
e7743cbb78
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue