Browse Source

* Handle EINTR for read/Write operations

git-svn-id: trunk@25341 -
michael 12 years ago
parent
commit
3dd8673212
1 changed files with 23 additions and 10 deletions
  1. 23 10
      packages/fcl-net/src/ssockets.pp

+ 23 - 10
packages/fcl-net/src/ssockets.pp

@@ -111,6 +111,7 @@ type
     Procedure StopAccepting;
     Procedure StopAccepting;
     Procedure SetNonBlocking;
     Procedure SetNonBlocking;
     Property Bound : Boolean Read FBound;
     Property Bound : Boolean Read FBound;
+    // Maximium number of connections in total. *Not* the simultaneous connection count. -1 keeps accepting.
     Property MaxConnections : longint Read FMaxConnections Write FMaxConnections;
     Property MaxConnections : longint Read FMaxConnections Write FMaxConnections;
     Property QueueSize : Longint Read FQueueSize Write FQueueSize default 5;
     Property QueueSize : Longint Read FQueueSize Write FQueueSize default 5;
     Property OnConnect : TConnectEvent Read FOnConnect Write FOnConnect;
     Property OnConnect : TConnectEvent Read FOnConnect Write FOnConnect;
@@ -273,11 +274,17 @@ Var
 
 
 begin
 begin
   Flags:=FReadFlags;
   Flags:=FReadFlags;
-  Result:=fprecv(handle,@Buffer,count,flags);
-  If Result<0 then
-    FLastError:=SocketError
-  else
-    FLastError:=0;
+{$ifdef unix}
+  Repeat
+{$endif}
+    Result:=fprecv(handle,@Buffer,count,flags);
+    If Result<0 then
+      FLastError:=SocketError
+    else
+      FLastError:=0;
+{$ifdef unix}
+  Until (FlastError<>ESysEINTR);
+{$ENDIF}
 end;
 end;
 
 
 Function TSocketStream.Write (Const Buffer; Count : Longint) :Longint;
 Function TSocketStream.Write (Const Buffer; Count : Longint) :Longint;
@@ -287,11 +294,17 @@ Var
 
 
 begin
 begin
   Flags:=FWriteFlags;
   Flags:=FWriteFlags;
-  Result:=fpsend(handle,@Buffer,count,flags);
-  If Result<0 then
-    FLastError:=SocketError
-  else
-    FlastError:=0;
+{$ifdef unix}
+  Repeat
+{$endif}
+    Result:=fpsend(handle,@Buffer,count,flags);
+    If Result<0 then
+      FLastError:=SocketError
+    else
+      FlastError:=0;
+{$ifdef unix}
+  Until (FlastError<>ESysEINTR);
+{$ENDIF}
 end;
 end;
 
 
 function TSocketStream.GetLocalAddress: TSockAddr;
 function TSocketStream.GetLocalAddress: TSockAddr;