tech-toolchain archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

make: cannot vfork() twice - on darwin



This is "cute", only seems to impact darwin so far.
We get an error from vfork() if we've already done it
(this happens when trying to export a var that uses :sh in the child).
Index: main.c
===================================================================
RCS file: /cvsroot/src/usr.bin/make/main.c,v
retrieving revision 1.181
diff -u -p -r1.181 main.c
--- main.c 22 Apr 2010 20:25:16 -0000 1.181
+++ main.c 22 Apr 2010 22:24:34 -0000
@@ -1547,6 +1547,7 @@ Check_Cwd(const char **argv)
 char *
 Cmd_Exec(const char *cmd, const char **errnum)
 {
+ static int mypid = 0;
 const char *args[4]; /* Args for invoking the shell */
 int fds[2]; /* Pipe streams */
 int cpid; /* Child PID */
@@ -1560,6 +1561,10 @@ Cmd_Exec(const char *cmd, const char **e
 
 *errnum = NULL;
 
+ pid = getpid();
+ if (!mypid)
+ mypid = pid;
+
 if (!shellName)
 Shell_Init();
 /*
@@ -1581,7 +1586,17 @@ Cmd_Exec(const char *cmd, const char **e
 /*
 * Fork
 */
- switch (cpid = vfork()) {
+ if (pid == mypid) {
+ cpid = vfork();
+ } else {
+ /*
+ * We have already vfork'd
+ * we cannot do it again,
+ * at least on darwin.
+ */
+ cpid = fork();
+ }
+ switch (cpid) {
 case 0:
 /*
 * Close input side of pipe


Home | Main Index | Thread Index | Old Index

AltStyle によって変換されたページ (->オリジナル) /