develooper Front page | perl.perl5.porters | Postings from October 2003

[PATCH] pp_sys.c: pp_waitpid and EINTR

Thread Next
From:
Steve Grazzini
Date:
October 4, 2003 15:38
Subject:
[PATCH] pp_sys.c: pp_waitpid and EINTR
Message ID:
20031004221523.GA29324@grazzini.net
As spotted by Steve East on clp.misc: Perl's waitpid() will retry an
interrupted syscall with the wrong argument.

-- 
Steve

--- pp_sys.c~	2003-10-04 13:59:13.000000000 -0400
+++ pp_sys.c	2003-10-04 14:01:31.000000000 -0400
@@ -4037,27 +4037,28 @@
 {
 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(MACOS_TRADITIONAL)
     dSP; dTARGET;
-    Pid_t childpid;
+    Pid_t pid;
+    Pid_t result;
     int optype;
     int argflags;
 
     optype = POPi;
-    childpid = TOPi;
+    pid = TOPi;
     if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
-        childpid = wait4pid(childpid, &argflags, optype);
+        result = wait4pid(pid, &argflags, optype);
     else {
-        while ((childpid = wait4pid(childpid, &argflags, optype)) == -1 &&
+        while ((result = wait4pid(pid, &argflags, optype)) == -1 &&
 	       errno == EINTR) {
 	  PERL_ASYNC_CHECK();
 	}
     }
 #  if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
     /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
-    STATUS_NATIVE_SET((childpid && childpid != -1) ? argflags : -1);
+    STATUS_NATIVE_SET((result && result != -1) ? argflags : -1);
 #  else
-    STATUS_NATIVE_SET((childpid > 0) ? argflags : -1);
+    STATUS_NATIVE_SET((result > 0) ? argflags : -1);
 #  endif
-    SETi(childpid);
+    SETi(result);
     RETURN;
 #else
     DIE(aTHX_ PL_no_func, "waitpid");


Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About