@@ -79,7 +79,7 @@ public SocketConnectivitySubchannelTransport(
79
79
_socketConnectedTimer = NonCapturingTimer . Create ( OnCheckSocketConnection , state : null , Timeout . InfiniteTimeSpan , Timeout . InfiniteTimeSpan ) ;
80
80
}
81
81
82
- private object Lock => _subchannel . Lock ;
82
+ private Lock Lock => _subchannel . Lock ;
83
83
public DnsEndPoint ? CurrentEndPoint => _currentEndPoint ;
84
84
public TimeSpan ? ConnectTimeout { get ; }
85
85
public TransportStatus TransportStatus
@@ -132,7 +132,7 @@ public void Disconnect()
132
132
133
133
private void DisconnectUnsynchronized ( )
134
134
{
135
- Debug . Assert ( Monitor . IsEntered ( Lock ) ) ;
135
+ Debug . Assert ( Lock . IsHeldByCurrentThread ) ;
136
136
Debug . Assert ( ! _disposed ) ;
137
137
138
138
_initialSocket ? . Dispose ( ) ;
@@ -170,7 +170,8 @@ public async ValueTask<ConnectResult> TryConnectAsync(ConnectContext context, in
170
170
await _socketConnect ( socket , currentEndPoint , context . CancellationToken ) . ConfigureAwait ( false ) ;
171
171
SocketConnectivitySubchannelTransportLog . ConnectedSocket ( _logger , _subchannel . Id , currentEndPoint ) ;
172
172
173
- lock ( Lock )
173
+ Lock . Enter ( ) ;
174
+ try
174
175
{
175
176
_currentEndPoint = currentEndPoint ;
176
177
_lastEndPointIndex = currentIndex ;
@@ -184,6 +185,10 @@ public async ValueTask<ConnectResult> TryConnectAsync(ConnectContext context, in
184
185
// Instead, the socket timer target method reschedules the next run after it has finished.
185
186
_socketConnectedTimer . Change ( _socketPingInterval , Timeout . InfiniteTimeSpan ) ;
186
187
}
188
+ finally
189
+ {
190
+ Lock . Exit ( ) ;
191
+ }
187
192
188
193
_subchannel . UpdateConnectivityState ( ConnectivityState . Ready , "Successfully connected to socket." ) ;
189
194
return ConnectResult . Success ;
@@ -223,13 +228,18 @@ public async ValueTask<ConnectResult> TryConnectAsync(ConnectContext context, in
223
228
_subchannel . UpdateConnectivityState (
224
229
ConnectivityState . TransientFailure ,
225
230
new Status ( StatusCode . Unavailable , "Error connecting to subchannel." , firstConnectionError ) ) ;
226
- lock ( Lock )
231
+ Lock . Enter ( ) ;
232
+ try
227
233
{
228
234
if ( ! _disposed )
229
235
{
230
236
_socketConnectedTimer . Change ( Timeout . InfiniteTimeSpan , Timeout . InfiniteTimeSpan ) ;
231
237
}
232
238
}
239
+ finally
240
+ {
241
+ Lock . Exit ( ) ;
242
+ }
233
243
return result ;
234
244
}
235
245
@@ -319,7 +329,8 @@ public async ValueTask<Stream> GetStreamAsync(DnsEndPoint endPoint, Cancellation
319
329
DnsEndPoint ? socketEndPoint = null ;
320
330
List < ReadOnlyMemory < byte > > ? socketData = null ;
321
331
DateTime ? socketCreatedTime = null ;
322
- lock ( Lock )
332
+ Lock . Enter ( ) ;
333
+ try
323
334
{
324
335
if ( _initialSocket != null )
325
336
{
@@ -345,6 +356,10 @@ public async ValueTask<Stream> GetStreamAsync(DnsEndPoint endPoint, Cancellation
345
356
_socketConnectedTimer . Change ( Timeout . InfiniteTimeSpan , Timeout . InfiniteTimeSpan ) ;
346
357
}
347
358
}
359
+ finally
360
+ {
361
+ Lock . Exit ( ) ;
362
+ }
348
363
349
364
if ( socket != null )
350
365
{
@@ -384,11 +399,16 @@ public async ValueTask<Stream> GetStreamAsync(DnsEndPoint endPoint, Cancellation
384
399
// This stream wrapper intercepts dispose.
385
400
var stream = new StreamWrapper ( networkStream , OnStreamDisposed , socketData ) ;
386
401
387
- lock ( Lock )
402
+ Lock . Enter ( ) ;
403
+ try
388
404
{
389
405
_activeStreams . Add ( new ActiveStream ( endPoint , socket , stream ) ) ;
390
406
SocketConnectivitySubchannelTransportLog . StreamCreated ( _logger , _subchannel . Id , endPoint , CalculateInitialSocketDataLength ( socketData ) , _activeStreams . Count ) ;
391
407
}
408
+ finally
409
+ {
410
+ Lock . Exit ( ) ;
411
+ }
392
412
393
413
return stream ;
394
414
}
0 commit comments