@@ -17,11 +17,11 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets
17
17
internal sealed class SocketConnectionListener : IConnectionListener
18
18
{
19
19
private readonly MemoryPool < byte > _memoryPool ;
20
- private readonly int _numSchedulers ;
21
- private readonly PipeScheduler [ ] _schedulers ;
20
+ private readonly int _settingsCount ;
21
+ private readonly Settings [ ] _settings ;
22
22
private readonly ISocketsTrace _trace ;
23
23
private Socket ? _listenSocket ;
24
- private int _schedulerIndex ;
24
+ private int _settingsIndex ;
25
25
private readonly SocketTransportOptions _options ;
26
26
private SafeSocketHandle ? _socketHandle ;
27
27
@@ -38,21 +38,43 @@ internal SocketConnectionListener(
38
38
_memoryPool = _options . MemoryPoolFactory ( ) ;
39
39
var ioQueueCount = options . IOQueueCount ;
40
40
41
+ var maxReadBufferSize = _options . MaxReadBufferSize ?? 0 ;
42
+ var maxWriteBufferSize = _options . MaxWriteBufferSize ?? 0 ;
43
+ var applicationScheduler = options . UnsafePreferInlineScheduling ? PipeScheduler . Inline : PipeScheduler . ThreadPool ;
44
+
41
45
if ( ioQueueCount > 0 )
42
46
{
43
- _numSchedulers = ioQueueCount ;
44
- _schedulers = new IOQueue [ _numSchedulers ] ;
47
+ _settingsCount = ioQueueCount ;
48
+ _settings = new Settings [ _settingsCount ] ;
45
49
46
- for ( var i = 0 ; i < _numSchedulers ; i ++ )
50
+ for ( var i = 0 ; i < _settingsCount ; i ++ )
47
51
{
48
- _schedulers [ i ] = new IOQueue ( ) ;
52
+ var transportScheduler = options . UnsafePreferInlineScheduling ? PipeScheduler . Inline : new IOQueue ( ) ;
53
+
54
+ _settings [ i ] = new Settings
55
+ {
56
+ Scheduler = transportScheduler ,
57
+ InputOptions = new PipeOptions ( _memoryPool , applicationScheduler , transportScheduler , maxReadBufferSize , maxReadBufferSize / 2 , useSynchronizationContext : false ) ,
58
+ OutputOptions = new PipeOptions ( _memoryPool , transportScheduler , applicationScheduler , maxWriteBufferSize , maxWriteBufferSize / 2 , useSynchronizationContext : false )
59
+ } ;
49
60
}
50
61
}
51
62
else
52
63
{
53
- var directScheduler = new PipeScheduler [ ] { PipeScheduler . ThreadPool } ;
54
- _numSchedulers = directScheduler . Length ;
55
- _schedulers = directScheduler ;
64
+ var transportScheduler = options . UnsafePreferInlineScheduling ? PipeScheduler . Inline : PipeScheduler . ThreadPool ;
65
+
66
+ var directScheduler = new Settings [ ]
67
+ {
68
+ new Settings
69
+ {
70
+ Scheduler = transportScheduler ,
71
+ InputOptions = new PipeOptions ( _memoryPool , applicationScheduler , transportScheduler , maxReadBufferSize , maxReadBufferSize / 2 , useSynchronizationContext : false ) ,
72
+ OutputOptions = new PipeOptions ( _memoryPool , transportScheduler , applicationScheduler , maxWriteBufferSize , maxWriteBufferSize / 2 , useSynchronizationContext : false )
73
+ }
74
+ } ;
75
+
76
+ _settingsCount = directScheduler . Length ;
77
+ _settings = directScheduler ;
56
78
}
57
79
}
58
80
@@ -127,13 +149,19 @@ void BindSocket()
127
149
acceptSocket . NoDelay = _options . NoDelay ;
128
150
}
129
151
130
- var connection = new SocketConnection ( acceptSocket , _memoryPool , _schedulers [ _schedulerIndex ] , _trace ,
131
- _options . MaxReadBufferSize , _options . MaxWriteBufferSize , _options . WaitForDataBeforeAllocatingBuffer ,
132
- _options . UnsafePreferInlineScheduling ) ;
152
+ var setting = _settings [ _settingsIndex ] ;
153
+
154
+ var connection = new SocketConnection ( acceptSocket ,
155
+ _memoryPool ,
156
+ setting . Scheduler ,
157
+ _trace ,
158
+ setting . InputOptions ,
159
+ setting . OutputOptions ,
160
+ waitForData : _options . WaitForDataBeforeAllocatingBuffer ) ;
133
161
134
162
connection . Start ( ) ;
135
163
136
- _schedulerIndex = ( _schedulerIndex + 1 ) % _numSchedulers ;
164
+ _settingsIndex = ( _settingsIndex + 1 ) % _settingsCount ;
137
165
138
166
return connection ;
139
167
}
@@ -173,5 +201,12 @@ public ValueTask DisposeAsync()
173
201
_memoryPool . Dispose ( ) ;
174
202
return default ;
175
203
}
204
+
205
+ private class Settings
206
+ {
207
+ public PipeScheduler Scheduler { get ; init ; } = default ! ;
208
+ public PipeOptions InputOptions { get ; init ; } = default ! ;
209
+ public PipeOptions OutputOptions { get ; init ; } = default ! ;
210
+ }
176
211
}
177
212
}
0 commit comments