Skip to content

Commit 4d612cc

Browse files
committed
address feedback
1 parent 001e995 commit 4d612cc

File tree

5 files changed

+32
-115
lines changed

5 files changed

+32
-115
lines changed

src/Microsoft.Data.SqlClient/netcore/src/Microsoft.Data.SqlClient.csproj

-2
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,6 @@
344344
<Compile Include="Microsoft\Data\SqlClient\SqlDiagnosticListener.NetStandard.cs" />
345345
<Compile Include="Microsoft\Data\SqlClient\SqlDelegatedTransaction.NetStandard.cs" />
346346
<Compile Include="Microsoft\Data\SqlClient\TdsParser.NetStandard.cs" />
347-
<Compile Include="Microsoft\Data\SqlClient\SNI\ConcurrentQueueSemaphore.NetStandard.cs" />
348347
<Compile Include="Microsoft\Data\SqlClient\SNI\SNIStreams.Task.cs" />
349348
<Compile Include="Microsoft\Data\SqlClient\SNI\SslOverTdsStream.NetStandard.cs" />
350349
</ItemGroup>
@@ -395,7 +394,6 @@
395394
<Compile Include="Microsoft\Data\SqlClient\SNI\SslOverTdsStream.NetCoreApp.cs" />
396395
<Compile Include="Microsoft\Data\SqlClient\SqlConnectionFactory.AssemblyLoadContext.cs" />
397396
<Compile Include="Microsoft\Data\SqlClient\SqlDependencyUtils.AssemblyLoadContext.cs" />
398-
<Compile Include="Microsoft\Data\SqlClient\SNI\ConcurrentQueueSemaphore.NetCoreApp.cs" />
399397
<Compile Condition="$(TargetFramework.StartsWith('netcoreapp2.'))" Include="Microsoft\Data\SqlClient\SNI\SNIStreams.Task.cs" />
400398
<Compile Condition="!$(TargetFramework.StartsWith('netcoreapp2.'))" Include="Microsoft\Data\SqlClient\SNI\SNIStreams.ValueTask.cs" />
401399
</ItemGroup>

src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SNI/ConcurrentQueueSemaphore.NetCoreApp.cs

-32
This file was deleted.

src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SNI/ConcurrentQueueSemaphore.NetStandard.cs

-32
This file was deleted.

src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SNI/ConcurrentQueueSemaphore.cs

+28-12
Original file line numberDiff line numberDiff line change
@@ -15,29 +15,45 @@ namespace Microsoft.Data.SqlClient.SNI
1515
/// </summary>
1616
internal sealed partial class ConcurrentQueueSemaphore
1717
{
18-
private static readonly Action<Task, object> s_continuePop = ContinuePop;
19-
2018
private readonly SemaphoreSlim _semaphore;
21-
private readonly ConcurrentQueue<TaskCompletionSource<bool>> _queue =
22-
new ConcurrentQueue<TaskCompletionSource<bool>>();
19+
private readonly ConcurrentQueue<TaskCompletionSource<bool>> _queue;
2320

2421
public ConcurrentQueueSemaphore(int initialCount)
2522
{
2623
_semaphore = new SemaphoreSlim(initialCount);
24+
_queue = new ConcurrentQueue<TaskCompletionSource<bool>>();
2725
}
2826

29-
public void Release()
27+
public Task WaitAsync(CancellationToken cancellationToken)
3028
{
31-
_semaphore.Release();
29+
// try sync wait with 0 which will not block to see if we need to do an async wait
30+
if (_semaphore.Wait(0, cancellationToken))
31+
{
32+
return Task.CompletedTask;
33+
}
34+
else
35+
{
36+
var tcs = new TaskCompletionSource<bool>();
37+
_queue.Enqueue(tcs);
38+
_semaphore.WaitAsync().ContinueWith(
39+
continuationAction: static (Task task, object state) =>
40+
{
41+
ConcurrentQueue<TaskCompletionSource<bool>> queue = (ConcurrentQueue<TaskCompletionSource<bool>>)state;
42+
if (queue.TryDequeue(out TaskCompletionSource<bool> popped))
43+
{
44+
popped.SetResult(true);
45+
}
46+
},
47+
state: _queue,
48+
cancellationToken: cancellationToken
49+
);
50+
return tcs.Task;
51+
}
3252
}
3353

34-
private static void ContinuePop(Task task, object state)
54+
public void Release()
3555
{
36-
ConcurrentQueue<TaskCompletionSource<bool>> queue = (ConcurrentQueue<TaskCompletionSource<bool>>)state;
37-
if (queue.TryDequeue(out TaskCompletionSource<bool> popped))
38-
{
39-
popped.SetResult(true);
40-
}
56+
_semaphore.Release();
4157
}
4258
}
4359

src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SNI/SNIStreams.ValueTask.cs

+4-37
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,7 @@ internal sealed partial class SNISslStream
1212
{
1313
public override Task<int> ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
1414
{
15-
ValueTask<int> valueTask = ReadAsync(new Memory<byte>(buffer, offset, count), cancellationToken);
16-
if (valueTask.IsCompletedSuccessfully)
17-
{
18-
return Task.FromResult(valueTask.Result);
19-
}
20-
else
21-
{
22-
return valueTask.AsTask();
23-
}
15+
return ReadAsync(new Memory<byte>(buffer, offset, count), cancellationToken).AsTask();
2416
}
2517

2618
public override async ValueTask<int> ReadAsync(Memory<byte> buffer, CancellationToken cancellationToken = default)
@@ -38,15 +30,7 @@ public override async ValueTask<int> ReadAsync(Memory<byte> buffer, Cancellation
3830

3931
public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
4032
{
41-
ValueTask valueTask = WriteAsync(new Memory<byte>(buffer, offset, count), cancellationToken);
42-
if (valueTask.IsCompletedSuccessfully)
43-
{
44-
return Task.CompletedTask;
45-
}
46-
else
47-
{
48-
return valueTask.AsTask();
49-
}
33+
return WriteAsync(new Memory<byte>(buffer, offset, count), cancellationToken).AsTask();
5034
}
5135

5236
public override async ValueTask WriteAsync(ReadOnlyMemory<byte> buffer, CancellationToken cancellationToken = default)
@@ -63,20 +47,11 @@ public override async ValueTask WriteAsync(ReadOnlyMemory<byte> buffer, Cancella
6347
}
6448
}
6549

66-
6750
internal sealed partial class SNINetworkStream
6851
{
6952
public override Task<int> ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
7053
{
71-
ValueTask<int> valueTask = ReadAsync(new Memory<byte>(buffer, offset, count), cancellationToken);
72-
if (valueTask.IsCompletedSuccessfully)
73-
{
74-
return Task.FromResult(valueTask.Result);
75-
}
76-
else
77-
{
78-
return valueTask.AsTask();
79-
}
54+
return ReadAsync(new Memory<byte>(buffer, offset, count), cancellationToken).AsTask();
8055
}
8156

8257
public override async ValueTask<int> ReadAsync(Memory<byte> buffer, CancellationToken cancellationToken = default)
@@ -95,15 +70,7 @@ public override async ValueTask<int> ReadAsync(Memory<byte> buffer, Cancellation
9570
// Prevent the WriteAsync collisions by running the task in a Semaphore Slim
9671
public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
9772
{
98-
ValueTask valueTask = WriteAsync(new Memory<byte>(buffer, offset, count), cancellationToken);
99-
if (valueTask.IsCompletedSuccessfully)
100-
{
101-
return Task.CompletedTask;
102-
}
103-
else
104-
{
105-
return valueTask.AsTask();
106-
}
73+
return WriteAsync(new Memory<byte>(buffer, offset, count), cancellationToken).AsTask();
10774
}
10875

10976
public override async ValueTask WriteAsync(ReadOnlyMemory<byte> buffer, CancellationToken cancellationToken = default)

0 commit comments

Comments
 (0)