11using System . Collections . Concurrent ;
2- using System . Diagnostics ;
32using System . Net . Sockets ;
43using System . Runtime . CompilerServices ;
54
@@ -8,50 +7,61 @@ namespace DotNext.Net.Multiplexing;
87using Buffers ;
98using Threading ;
109
11- internal sealed class InputMultiplexer < T > (
12- ConcurrentDictionary < uint , MultiplexedStream > streams ,
13- AsyncAutoResetEvent writeSignal ,
14- BufferWriter < byte > framingBuffer ,
15- int flushThreshold ,
16- in TagList measurementTags ,
17- TimeSpan timeout ,
18- TimeSpan heartbeatTimeout ,
19- CancellationToken token ) : Multiplexer < T > ( streams , new ConcurrentQueue < ProtocolCommand > ( ) , measurementTags , token )
10+ internal sealed class InputMultiplexer < T > ( ) : Multiplexer < T > ( new ( ) , new ConcurrentQueue < ProtocolCommand > ( ) )
2011 where T : IStreamMetrics
2112{
22-
23- public TimeSpan Timeout => timeout ;
13+ public required TimeSpan Timeout { get ; init ; }
14+
15+ public required TimeSpan HeartbeatTimeout { private get ; init ; }
16+
17+ public required int FlushThreshold { private get ; init ; }
18+
19+ public required BufferWriter < byte > FramingBuffer { private get ; init ; }
20+
21+ public required AsyncAutoResetEvent TransportSignal { private get ; init ; }
2422
2523 public bool TryAddStream ( uint streamId , MultiplexedStream stream )
2624 {
27- var result = streams . TryAdd ( streamId , stream ) ;
25+ var result = Streams . TryAdd ( streamId , stream ) ;
2826 ChangeStreamCount ( Unsafe . BitCast < bool , byte > ( result ) ) ;
2927 return result ;
3028 }
3129
3230 public bool TryRemoveStream ( uint streamId , MultiplexedStream stream )
3331 {
34- var removed = streams . TryRemove ( new ( streamId , stream ) ) ;
32+ var removed = Streams . TryRemove ( new ( streamId , stream ) ) ;
3533 ChangeStreamCount ( - Unsafe . BitCast < bool , byte > ( removed ) ) ;
3634 return removed ;
3735 }
3836
39- public OutputMultiplexer < T > CreateOutput ( Memory < byte > framingBuffer , TimeSpan receiveTimeout )
40- => new ( streams , writeSignal , commands , framingBuffer , measurementTags , receiveTimeout , RootToken ) ;
37+ public OutputMultiplexer < T > CreateOutput ( Memory < byte > framingBuffer , TimeSpan receiveTimeout ) => new ( Streams , Commands )
38+ {
39+ MeasurementTags = MeasurementTags ,
40+ RootToken = RootToken ,
41+ FramingBuffer = framingBuffer ,
42+ Timeout = receiveTimeout ,
43+ TransportSignal = TransportSignal ,
44+ } ;
4145
4246 public OutputMultiplexer < T > CreateOutput ( Memory < byte > framingBuffer , TimeSpan receiveTimeout , MultiplexedStreamFactory handlerFactory ,
43- CancellationToken token )
44- => new ( streams , writeSignal , commands , framingBuffer , measurementTags , receiveTimeout , token )
45- { Factory = handlerFactory } ;
47+ CancellationToken token ) => new ( Streams , Commands )
48+ {
49+ MeasurementTags = MeasurementTags ,
50+ RootToken = token ,
51+ FramingBuffer = framingBuffer ,
52+ Timeout = receiveTimeout ,
53+ TransportSignal = TransportSignal ,
54+ Factory = handlerFactory ,
55+ } ;
4656
4757 public async Task ProcessAsync ( Func < bool > condition , Socket socket )
4858 {
49- using var enumerator = streams . GetEnumerator ( ) ;
59+ using var enumerator = Streams . GetEnumerator ( ) ;
5060 for ( var requiresHeartbeat = false ;
5161 condition ( ) ;
52- requiresHeartbeat = ! await writeSignal . WaitAsync ( heartbeatTimeout , RootToken ) . ConfigureAwait ( false ) )
62+ requiresHeartbeat = ! await TransportSignal . WaitAsync ( HeartbeatTimeout , RootToken ) . ConfigureAwait ( false ) )
5363 {
54- framingBuffer . Clear ( reuseBuffer : true ) ;
64+ FramingBuffer . Clear ( reuseBuffer : true ) ;
5565
5666 // combine streams
5767 while ( enumerator . MoveNext ( ) )
@@ -60,33 +70,33 @@ public async Task ProcessAsync(Func<bool> condition, Socket socket)
6070
6171 if ( stream . IsCompleted && TryRemoveStream ( streamId , stream ) )
6272 {
63- Protocol . WriteStreamClosed ( framingBuffer , streamId ) ;
73+ Protocol . WriteStreamClosed ( FramingBuffer , streamId ) ;
6474 }
6575 else
6676 {
67- await stream . WriteFrameAsync ( framingBuffer , streamId ) . ConfigureAwait ( false ) ;
77+ await stream . WriteFrameAsync ( FramingBuffer , streamId ) . ConfigureAwait ( false ) ;
6878 }
6979
7080 // write the buffer on overflow
71- if ( framingBuffer . WrittenCount >= flushThreshold )
81+ if ( FramingBuffer . WrittenCount >= FlushThreshold )
7282 {
73- await SendAsync ( framingBuffer . WrittenMemory , socket ) . ConfigureAwait ( false ) ;
74- framingBuffer . Clear ( reuseBuffer : true ) ;
83+ await SendAsync ( FramingBuffer . WrittenMemory , socket ) . ConfigureAwait ( false ) ;
84+ FramingBuffer . Clear ( reuseBuffer : true ) ;
7585 }
7686 }
7787
7888 // process protocol commands
79- commands . Serialize ( framingBuffer ) ;
89+ Commands . Serialize ( FramingBuffer ) ;
8090
81- switch ( framingBuffer . WrittenCount )
91+ switch ( FramingBuffer . WrittenCount )
8292 {
8393 case 0 when requiresHeartbeat :
84- Protocol . WriteHeartbeat ( framingBuffer ) ;
94+ Protocol . WriteHeartbeat ( FramingBuffer ) ;
8595 goto default ;
8696 case 0 :
8797 break ;
8898 default :
89- await SendAsync ( framingBuffer . WrittenMemory , socket ) . ConfigureAwait ( false ) ;
99+ await SendAsync ( FramingBuffer . WrittenMemory , socket ) . ConfigureAwait ( false ) ;
90100 break ;
91101 }
92102
@@ -99,7 +109,7 @@ private async ValueTask SendAsync(ReadOnlyMemory<byte> buffer, Socket socket)
99109 {
100110 for ( int bytesWritten ; ! buffer . IsEmpty ; buffer = buffer . Slice ( bytesWritten ) )
101111 {
102- StartOperation ( timeout ) ;
112+ StartOperation ( Timeout ) ;
103113 try
104114 {
105115 bytesWritten = await socket . SendAsync ( buffer , TimeBoundedToken ) . ConfigureAwait ( false ) ;
@@ -121,9 +131,9 @@ private async ValueTask SendAsync(ReadOnlyMemory<byte> buffer, Socket socket)
121131
122132 public async ValueTask CompleteAllAsync ( Exception e )
123133 {
124- foreach ( var id in streams . Keys )
134+ foreach ( var id in Streams . Keys )
125135 {
126- if ( streams . TryRemove ( id , out var stream ) )
136+ if ( Streams . TryRemove ( id , out var stream ) )
127137 {
128138 await stream . CompleteTransportOutputAsync ( e ) . ConfigureAwait ( false ) ;
129139 await stream . CompleteTransportInputAsync ( e ) . ConfigureAwait ( false ) ;
0 commit comments