Module Name: src Committed By: rillig Date: Sat May 25 15:37:17 UTC 2024
Modified Files: src/usr.bin/make: compat.c src/usr.bin/make/unit-tests: shell-csh.mk Log Message: make: minimize local variables around a vfork call Passing all relevant values as arguments allows to remove the 'volatile' qualifiers. To generate a diff of this commit: cvs rdiff -u -r1.255 -r1.256 src/usr.bin/make/compat.c cvs rdiff -u -r1.8 -r1.9 src/usr.bin/make/unit-tests/shell-csh.mk Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.bin/make/compat.c diff -u src/usr.bin/make/compat.c:1.255 src/usr.bin/make/compat.c:1.256 --- src/usr.bin/make/compat.c:1.255 Sat Apr 20 10:18:55 2024 +++ src/usr.bin/make/compat.c Sat May 25 15:37:17 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: compat.c,v 1.255 2024/04/20 10:18:55 rillig Exp $ */ +/* $NetBSD: compat.c,v 1.256 2024/05/25 15:37:17 rillig Exp $ */ /* * Copyright (c) 1988, 1989, 1990 The Regents of the University of California. @@ -91,7 +91,7 @@ #include "pathnames.h" /* "@(#)compat.c 8.2 (Berkeley) 3/19/94" */ -MAKE_RCSID("$NetBSD: compat.c,v 1.255 2024/04/20 10:18:55 rillig Exp $"); +MAKE_RCSID("$NetBSD: compat.c,v 1.256 2024/05/25 15:37:17 rillig Exp $"); static GNode *curTarg = NULL; static pid_t compatChild; @@ -200,6 +200,24 @@ UseShell(const char *cmd MAKE_ATTR_UNUSE #endif } +static int +Compat_Spawn(const char **av) +{ + int pid = vfork(); + if (pid < 0) + Fatal("Could not fork"); + + if (pid == 0) { +#ifdef USE_META + if (useMeta) + meta_compat_child(); +#endif + (void)execvp(av[0], (char *const *)UNCONST(av)); + execDie("exec", av[0]); + } + return pid; +} + /* * Execute the next command for a target. If the command returns an error, * the node's made field is set to ERROR and creation stops. @@ -222,13 +240,12 @@ Compat_RunCommand(const char *cmdp, GNod volatile bool errCheck; /* Check errors */ int reason; /* Reason for child's death */ int status; /* Description of child's death */ - pid_t cpid; /* Child actually found */ pid_t retstat; /* Result of wait */ - const char **volatile av; /* Argument vector for thing to exec */ + const char **av; /* Arguments for the child process */ char **volatile mav; /* Copy of the argument vector for freeing */ bool useShell; /* True if command should be executed using a * shell */ - const char *volatile cmd = cmdp; + const char *cmd = cmdp; silent = (gn->type & OP_SILENT) != OP_NONE; errCheck = !(gn->type & OP_IGNORE); @@ -330,19 +347,7 @@ Compat_RunCommand(const char *cmdp, GNod Var_ReexportVars(gn); - compatChild = cpid = vfork(); - if (cpid < 0) - Fatal("Could not fork"); - - if (cpid == 0) { -#ifdef USE_META - if (useMeta) - meta_compat_child(); -#endif - (void)execvp(av[0], (char *const *)UNCONST(av)); - execDie("exec", av[0]); - } - + compatChild = Compat_Spawn(av); free(mav); free(bp); @@ -352,11 +357,11 @@ Compat_RunCommand(const char *cmdp, GNod #ifdef USE_META if (useMeta) - meta_compat_parent(cpid); + meta_compat_parent(compatChild); #endif /* The child is off and running. Now all we can do is wait... */ - while ((retstat = wait(&reason)) != cpid) { + while ((retstat = wait(&reason)) != compatChild) { if (retstat > 0) JobReapChild(retstat, reason, false); /* not ours? */ if (retstat == -1 && errno != EINTR) Index: src/usr.bin/make/unit-tests/shell-csh.mk diff -u src/usr.bin/make/unit-tests/shell-csh.mk:1.8 src/usr.bin/make/unit-tests/shell-csh.mk:1.9 --- src/usr.bin/make/unit-tests/shell-csh.mk:1.8 Sun Apr 4 09:58:51 2021 +++ src/usr.bin/make/unit-tests/shell-csh.mk Sat May 25 15:37:17 2024 @@ -1,4 +1,4 @@ -# $NetBSD: shell-csh.mk,v 1.8 2021/04/04 09:58:51 rillig Exp $ +# $NetBSD: shell-csh.mk,v 1.9 2024/05/25 15:37:17 rillig Exp $ # # Tests for using a C shell for running the commands. @@ -6,7 +6,7 @@ CSH!= which csh 2> /dev/null || true # The shell path must be an absolute path. # This is only obvious in parallel mode since in compat mode, -# simple commands are executed via execve directly. +# simple commands are executed via execvp directly. .if ${CSH} != "" .SHELL: name="csh" path="${CSH}" .endif