@@ -1242,11 +1242,23 @@ private void PerformSyncOperation<TOperation>(ref OperationQueue<TOperation> que
12421242 }
12431243 }
12441244
1245- public SocketError Accept ( byte [ ] socketAddress , ref int socketAddressLen , int timeout , out IntPtr acceptedFd )
1245+ private bool ShouldRetrySyncOperation ( out SocketError errorCode )
1246+ {
1247+ if ( _nonBlockingSet )
1248+ {
1249+ errorCode = SocketError . Success ; // Will be ignored
1250+ return true ;
1251+ }
1252+
1253+ // We are in blocking mode, so the EAGAIN we received indicates a timeout.
1254+ errorCode = SocketError . TimedOut ;
1255+ return false ;
1256+ }
1257+
1258+ public SocketError Accept ( byte [ ] socketAddress , ref int socketAddressLen , out IntPtr acceptedFd )
12461259 {
12471260 Debug . Assert ( socketAddress != null , "Expected non-null socketAddress" ) ;
12481261 Debug . Assert ( socketAddressLen > 0 , $ "Unexpected socketAddressLen: { socketAddressLen } ") ;
1249- Debug . Assert ( timeout == - 1 || timeout > 0 , $ "Unexpected timeout: { timeout } ") ;
12501262
12511263 SocketError errorCode ;
12521264 int observedSequenceNumber ;
@@ -1263,7 +1275,7 @@ public SocketError Accept(byte[] socketAddress, ref int socketAddressLen, int ti
12631275 SocketAddressLen = socketAddressLen ,
12641276 } ;
12651277
1266- PerformSyncOperation ( ref _receiveQueue , operation , timeout , observedSequenceNumber ) ;
1278+ PerformSyncOperation ( ref _receiveQueue , operation , - 1 , observedSequenceNumber ) ;
12671279
12681280 socketAddressLen = operation . SocketAddressLen ;
12691281 acceptedFd = operation . AcceptedFileDescriptor ;
@@ -1307,11 +1319,10 @@ public SocketError AcceptAsync(byte[] socketAddress, ref int socketAddressLen, o
13071319 return SocketError . IOPending ;
13081320 }
13091321
1310- public SocketError Connect ( byte [ ] socketAddress , int socketAddressLen , int timeout )
1322+ public SocketError Connect ( byte [ ] socketAddress , int socketAddressLen )
13111323 {
13121324 Debug . Assert ( socketAddress != null , "Expected non-null socketAddress" ) ;
13131325 Debug . Assert ( socketAddressLen > 0 , $ "Unexpected socketAddressLen: { socketAddressLen } ") ;
1314- Debug . Assert ( timeout == - 1 || timeout > 0 , $ "Unexpected timeout: { timeout } ") ;
13151326
13161327 // Connect is different than the usual "readiness" pattern of other operations.
13171328 // We need to call TryStartConnect to initiate the connect with the OS,
@@ -1332,7 +1343,7 @@ public SocketError Connect(byte[] socketAddress, int socketAddressLen, int timeo
13321343 SocketAddressLen = socketAddressLen
13331344 } ;
13341345
1335- PerformSyncOperation ( ref _sendQueue , operation , timeout , observedSequenceNumber ) ;
1346+ PerformSyncOperation ( ref _sendQueue , operation , - 1 , observedSequenceNumber ) ;
13361347
13371348 return operation . ErrorCode ;
13381349 }
@@ -1398,7 +1409,8 @@ public SocketError ReceiveFrom(Memory<byte> buffer, ref SocketFlags flags, byte[
13981409 SocketError errorCode ;
13991410 int observedSequenceNumber ;
14001411 if ( _receiveQueue . IsReady ( this , out observedSequenceNumber ) &&
1401- SocketPal . TryCompleteReceiveFrom ( _socket , buffer . Span , flags , socketAddress , ref socketAddressLen , out bytesReceived , out receivedFlags , out errorCode ) )
1412+ ( SocketPal . TryCompleteReceiveFrom ( _socket , buffer . Span , flags , socketAddress , ref socketAddressLen , out bytesReceived , out receivedFlags , out errorCode ) ||
1413+ ! ShouldRetrySyncOperation ( out errorCode ) ) )
14021414 {
14031415 flags = receivedFlags ;
14041416 return errorCode ;
@@ -1425,7 +1437,8 @@ public unsafe SocketError ReceiveFrom(Span<byte> buffer, ref SocketFlags flags,
14251437 SocketError errorCode ;
14261438 int observedSequenceNumber ;
14271439 if ( _receiveQueue . IsReady ( this , out observedSequenceNumber ) &&
1428- SocketPal . TryCompleteReceiveFrom ( _socket , buffer , flags , socketAddress , ref socketAddressLen , out bytesReceived , out receivedFlags , out errorCode ) )
1440+ ( SocketPal . TryCompleteReceiveFrom ( _socket , buffer , flags , socketAddress , ref socketAddressLen , out bytesReceived , out receivedFlags , out errorCode ) ||
1441+ ! ShouldRetrySyncOperation ( out errorCode ) ) )
14291442 {
14301443 flags = receivedFlags ;
14311444 return errorCode ;
@@ -1503,7 +1516,8 @@ public SocketError ReceiveFrom(IList<ArraySegment<byte>> buffers, ref SocketFlag
15031516 SocketError errorCode ;
15041517 int observedSequenceNumber ;
15051518 if ( _receiveQueue . IsReady ( this , out observedSequenceNumber ) &&
1506- SocketPal . TryCompleteReceiveFrom ( _socket , buffers , flags , socketAddress , ref socketAddressLen , out bytesReceived , out receivedFlags , out errorCode ) )
1519+ ( SocketPal . TryCompleteReceiveFrom ( _socket , buffers , flags , socketAddress , ref socketAddressLen , out bytesReceived , out receivedFlags , out errorCode ) ||
1520+ ! ShouldRetrySyncOperation ( out errorCode ) ) )
15071521 {
15081522 flags = receivedFlags ;
15091523 return errorCode ;
@@ -1570,7 +1584,8 @@ public SocketError ReceiveMessageFrom(
15701584 SocketError errorCode ;
15711585 int observedSequenceNumber ;
15721586 if ( _receiveQueue . IsReady ( this , out observedSequenceNumber ) &&
1573- SocketPal . TryCompleteReceiveMessageFrom ( _socket , buffer . Span , buffers , flags , socketAddress , ref socketAddressLen , isIPv4 , isIPv6 , out bytesReceived , out receivedFlags , out ipPacketInformation , out errorCode ) )
1587+ ( SocketPal . TryCompleteReceiveMessageFrom ( _socket , buffer . Span , buffers , flags , socketAddress , ref socketAddressLen , isIPv4 , isIPv6 , out bytesReceived , out receivedFlags , out ipPacketInformation , out errorCode ) ||
1588+ ! ShouldRetrySyncOperation ( out errorCode ) ) )
15741589 {
15751590 flags = receivedFlags ;
15761591 return errorCode ;
@@ -1657,7 +1672,8 @@ public SocketError SendTo(byte[] buffer, int offset, int count, SocketFlags flag
16571672 SocketError errorCode ;
16581673 int observedSequenceNumber ;
16591674 if ( _sendQueue . IsReady ( this , out observedSequenceNumber ) &&
1660- SocketPal . TryCompleteSendTo ( _socket , buffer , ref offset , ref count , flags , socketAddress , socketAddressLen , ref bytesSent , out errorCode ) )
1675+ ( SocketPal . TryCompleteSendTo ( _socket , buffer , ref offset , ref count , flags , socketAddress , socketAddressLen , ref bytesSent , out errorCode ) ||
1676+ ! ShouldRetrySyncOperation ( out errorCode ) ) )
16611677 {
16621678 return errorCode ;
16631679 }
@@ -1688,7 +1704,8 @@ public unsafe SocketError SendTo(ReadOnlySpan<byte> buffer, SocketFlags flags, b
16881704 int bufferIndexIgnored = 0 , offset = 0 , count = buffer . Length ;
16891705 int observedSequenceNumber ;
16901706 if ( _sendQueue . IsReady ( this , out observedSequenceNumber ) &&
1691- SocketPal . TryCompleteSendTo ( _socket , buffer , null , ref bufferIndexIgnored , ref offset , ref count , flags , socketAddress , socketAddressLen , ref bytesSent , out errorCode ) )
1707+ ( SocketPal . TryCompleteSendTo ( _socket , buffer , null , ref bufferIndexIgnored , ref offset , ref count , flags , socketAddress , socketAddressLen , ref bytesSent , out errorCode ) ||
1708+ ! ShouldRetrySyncOperation ( out errorCode ) ) )
16921709 {
16931710 return errorCode ;
16941711 }
@@ -1769,7 +1786,8 @@ public SocketError SendTo(IList<ArraySegment<byte>> buffers, SocketFlags flags,
17691786 SocketError errorCode ;
17701787 int observedSequenceNumber ;
17711788 if ( _sendQueue . IsReady ( this , out observedSequenceNumber ) &&
1772- SocketPal . TryCompleteSendTo ( _socket , buffers , ref bufferIndex , ref offset , flags , socketAddress , socketAddressLen , ref bytesSent , out errorCode ) )
1789+ ( SocketPal . TryCompleteSendTo ( _socket , buffers , ref bufferIndex , ref offset , flags , socketAddress , socketAddressLen , ref bytesSent , out errorCode ) ||
1790+ ! ShouldRetrySyncOperation ( out errorCode ) ) )
17731791 {
17741792 return errorCode ;
17751793 }
@@ -1836,7 +1854,8 @@ public SocketError SendFile(SafeFileHandle fileHandle, long offset, long count,
18361854 SocketError errorCode ;
18371855 int observedSequenceNumber ;
18381856 if ( _sendQueue . IsReady ( this , out observedSequenceNumber ) &&
1839- SocketPal . TryCompleteSendFile ( _socket , fileHandle , ref offset , ref count , ref bytesSent , out errorCode ) )
1857+ ( SocketPal . TryCompleteSendFile ( _socket , fileHandle , ref offset , ref count , ref bytesSent , out errorCode ) ||
1858+ ! ShouldRetrySyncOperation ( out errorCode ) ) )
18401859 {
18411860 return errorCode ;
18421861 }
0 commit comments