Skip to content

Commit d2c7b65

Browse files
authored
Remove the double dispatch on Windows for IO (#43449)
The windows IO thread pool was replaced with one that dispatches to the thread pool. As a result, we remove the extra thread pool dispatch that we originally had for windows because continuations for IO on windows ran on the same thread that polls for IO.
1 parent 63fb7a8 commit d2c7b65

File tree

2 files changed

+5
-14
lines changed

2 files changed

+5
-14
lines changed

src/Servers/Kestrel/Transport.Sockets/src/Internal/SocketConnection.cs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ internal sealed partial class SocketConnection : TransportConnection
3333

3434
internal SocketConnection(Socket socket,
3535
MemoryPool<byte> memoryPool,
36-
PipeScheduler transportScheduler,
36+
PipeScheduler socketScheduler,
3737
ILogger logger,
3838
SocketSenderPool socketSenderPool,
3939
PipeOptions inputOptions,
@@ -55,12 +55,7 @@ internal SocketConnection(Socket socket,
5555

5656
ConnectionClosed = _connectionClosedTokenSource.Token;
5757

58-
// On *nix platforms, Sockets already dispatches to the ThreadPool.
59-
// Yes, the IOQueues are still used for the PipeSchedulers. This is intentional.
60-
// https://github.com/aspnet/KestrelHttpServer/issues/2573
61-
var awaiterScheduler = OperatingSystem.IsWindows() ? transportScheduler : PipeScheduler.Inline;
62-
63-
_receiver = new SocketReceiver(awaiterScheduler);
58+
_receiver = new SocketReceiver(socketScheduler);
6459

6560
var pair = DuplexPipe.CreateConnectionPair(inputOptions, outputOptions);
6661

src/Servers/Kestrel/Transport.Sockets/src/SocketConnectionContextFactory.cs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -56,15 +56,13 @@ public SocketConnectionContextFactory(SocketConnectionFactoryOptions options, IL
5656
{
5757
var memoryPool = _options.MemoryPoolFactory();
5858
var transportScheduler = options.UnsafePreferInlineScheduling ? PipeScheduler.Inline : new IOQueue();
59-
// https://github.com/aspnet/KestrelHttpServer/issues/2573
60-
var awaiterScheduler = OperatingSystem.IsWindows() ? transportScheduler : PipeScheduler.Inline;
6159

6260
_settings[i] = new QueueSettings()
6361
{
6462
Scheduler = transportScheduler,
6563
InputOptions = new PipeOptions(memoryPool, applicationScheduler, transportScheduler, maxReadBufferSize, maxReadBufferSize / 2, useSynchronizationContext: false),
6664
OutputOptions = new PipeOptions(memoryPool, transportScheduler, applicationScheduler, maxWriteBufferSize, maxWriteBufferSize / 2, useSynchronizationContext: false),
67-
SocketSenderPool = new SocketSenderPool(awaiterScheduler),
65+
SocketSenderPool = new SocketSenderPool(transportScheduler),
6866
MemoryPool = memoryPool,
6967
};
7068
}
@@ -73,16 +71,14 @@ public SocketConnectionContextFactory(SocketConnectionFactoryOptions options, IL
7371
{
7472
var memoryPool = _options.MemoryPoolFactory();
7573
var transportScheduler = options.UnsafePreferInlineScheduling ? PipeScheduler.Inline : PipeScheduler.ThreadPool;
76-
// https://github.com/aspnet/KestrelHttpServer/issues/2573
77-
var awaiterScheduler = OperatingSystem.IsWindows() ? transportScheduler : PipeScheduler.Inline;
7874
_settings = new QueueSettings[]
7975
{
8076
new QueueSettings()
8177
{
8278
Scheduler = transportScheduler,
8379
InputOptions = new PipeOptions(memoryPool, applicationScheduler, transportScheduler, maxReadBufferSize, maxReadBufferSize / 2, useSynchronizationContext: false),
8480
OutputOptions = new PipeOptions(memoryPool, transportScheduler, applicationScheduler, maxWriteBufferSize, maxWriteBufferSize / 2, useSynchronizationContext: false),
85-
SocketSenderPool = new SocketSenderPool(awaiterScheduler),
81+
SocketSenderPool = new SocketSenderPool(PipeScheduler.Inline),
8682
MemoryPool = memoryPool,
8783
}
8884
};
@@ -101,7 +97,7 @@ public ConnectionContext Create(Socket socket)
10197

10298
var connection = new SocketConnection(socket,
10399
setting.MemoryPool,
104-
setting.Scheduler,
100+
PipeScheduler.Inline,
105101
_logger,
106102
setting.SocketSenderPool,
107103
setting.InputOptions,

0 commit comments

Comments
 (0)