@@ -17,11 +17,11 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets
1717 internal sealed class SocketConnectionListener : IConnectionListener
1818 {
1919 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 ;
2222 private readonly ISocketsTrace _trace ;
2323 private Socket ? _listenSocket ;
24- private int _schedulerIndex ;
24+ private int _settingsIndex ;
2525 private readonly SocketTransportOptions _options ;
2626 private SafeSocketHandle ? _socketHandle ;
2727
@@ -38,21 +38,43 @@ internal SocketConnectionListener(
3838 _memoryPool = _options . MemoryPoolFactory ( ) ;
3939 var ioQueueCount = options . IOQueueCount ;
4040
41+ var maxReadBufferSize = _options . MaxReadBufferSize ?? 0 ;
42+ var maxWriteBufferSize = _options . MaxWriteBufferSize ?? 0 ;
43+ var applicationScheduler = options . UnsafePreferInlineScheduling ? PipeScheduler . Inline : PipeScheduler . ThreadPool ;
44+
4145 if ( ioQueueCount > 0 )
4246 {
43- _numSchedulers = ioQueueCount ;
44- _schedulers = new IOQueue [ _numSchedulers ] ;
47+ _settingsCount = ioQueueCount ;
48+ _settings = new Settings [ _settingsCount ] ;
4549
46- for ( var i = 0 ; i < _numSchedulers ; i ++ )
50+ for ( var i = 0 ; i < _settingsCount ; i ++ )
4751 {
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+ } ;
4960 }
5061 }
5162 else
5263 {
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 ;
5678 }
5779 }
5880
@@ -127,13 +149,19 @@ void BindSocket()
127149 acceptSocket . NoDelay = _options . NoDelay ;
128150 }
129151
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 ) ;
133161
134162 connection . Start ( ) ;
135163
136- _schedulerIndex = ( _schedulerIndex + 1 ) % _numSchedulers ;
164+ _settingsIndex = ( _settingsIndex + 1 ) % _settingsCount ;
137165
138166 return connection ;
139167 }
@@ -173,5 +201,12 @@ public ValueTask DisposeAsync()
173201 _memoryPool . Dispose ( ) ;
174202 return default ;
175203 }
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+ }
176211 }
177212}
0 commit comments