浏览代码

* and yet more ESysEINTR handling

git-svn-id: trunk@12927 -
Jonas Maebe 16 年之前
父节点
当前提交
d79161a01a
共有 1 个文件被更改,包括 10 次插入4 次删除
  1. 10 4
      packages/fcl-async/src/unix/libasync.pp

+ 10 - 4
packages/fcl-async/src/unix/libasync.pp

@@ -86,14 +86,20 @@ var
   CurIOCallback: PIOCallbackData;
   CurIOCallback: PIOCallbackData;
 begin
 begin
   if Handle^.Data.HighestHandle < 0 then
   if Handle^.Data.HighestHandle < 0 then
-    // No I/O checks to do, so just wait...
-    AsyncResult := fpselect(0, nil, nil, nil, TimeOut)
+    begin
+      // No I/O checks to do, so just wait...
+      repeat
+        AsyncResult := fpselect(0, nil, nil, nil, TimeOut)
+      until (AsyncResult<>-1) or (fpgeterrno<>ESysEINTR);
+    end
   else
   else
   begin
   begin
     CurReadFDSet := PFDSet(Handle^.Data.FDData)[0];
     CurReadFDSet := PFDSet(Handle^.Data.FDData)[0];
     CurWriteFDSet := PFDSet(Handle^.Data.FDData)[1];
     CurWriteFDSet := PFDSet(Handle^.Data.FDData)[1];
-    AsyncResult := fpselect(Handle^.Data.HighestHandle + 1,
-      @CurReadFDSet, @CurWriteFDSet, nil, TimeOut);
+    repeat
+      AsyncResult := fpselect(Handle^.Data.HighestHandle + 1,
+        @CurReadFDSet, @CurWriteFDSet, nil, TimeOut);
+    until (AsyncResult<>-1) or (fpgeterrno<>ESysEINTR);
 
 
     if AsyncResult > 0 then
     if AsyncResult > 0 then
     begin
     begin