]> git.e2factory.org Git - e2factory.git/commitdiff
e2lib: handle EINTR in poll() and wait()
authorTobias Ulmer <tu@emlix.com>
Wed, 13 Feb 2019 14:11:11 +0000 (15:11 +0100)
committerTobias Ulmer <tu@emlix.com>
Wed, 13 Feb 2019 14:11:11 +0000 (15:11 +0100)
Signed-off-by: Tobias Ulmer <tu@emlix.com>
generic/e2lib.lua

index aec3579ba5f8fe4bd09bf1ee56cfb0727a1f914b..3daaae7419c618e15594202cb55c83296c390a6b 100644 (file)
@@ -228,7 +228,19 @@ end
 -- @return Process ID of the terminated child or error object on failure.
 -- @return Number of signal that killed the process, if any.
 function e2lib.wait(pid)
-    local rc, childpid, sig = le2lib.wait(pid)
+    while true do
+        local rc, childpid, sig = le2lib.wait(pid)
+        if not rc then
+            if sig ~= errno.def2errnum("EINTR") then
+                return false,
+                    err.new("waiting for child %d failed: %s", pid, childpid)
+            end
+            e2lib.log(4, "wait(%d) returned EINTR", childpid)
+        else
+            return rc, childpid, sig
+        end
+    end
+end
 
     if not rc then
         return false, err.new("waiting for child %d failed: %s", pid, childpid)
@@ -250,14 +262,16 @@ end
 --         fd in the fdvec table.
 -- @return Error object on failure.
 function e2lib.poll(timeout, fdvec)
-    local pollvec, errstring
-
-    pollvec, errstring = le2lib.poll(timeout, fdvec)
-    if not pollvec then
-        return false, err.new("poll() failed: %s", errstring)
+    while true do
+        local pollvec, errstring, e = le2lib.poll(timeout, fdvec)
+        if not pollvec then
+            if e ~= errno.def2errnum("EINTR") then
+                return false, err.new("poll() failed: %s", errstring)
+            end
+        else
+            return pollvec
+        end
     end
-
-    return pollvec
 end
 
 --- Rename file or directory using the rename syscall.