Module Name:    src
Committed By:   rillig
Date:           Thu Dec 10 20:49:11 UTC 2020

Modified Files:
        src/usr.bin/make: compat.c job.c job.h meta.c meta.h trace.c
        src/usr.bin/make/unit-tests: opt-debug-jobs.exp

Log Message:
make(1): split JobFlags into separate fields

Having all these flags in a single bitmask makes it harder to see where
exactly they can possibly be used since their state could also be
modified using the unsuspicious job->flags = 0.  Using individual names
just leaves the single memset, and that is only used during
initialization.


To generate a diff of this commit:
cvs rdiff -u -r1.204 -r1.205 src/usr.bin/make/compat.c
cvs rdiff -u -r1.353 -r1.354 src/usr.bin/make/job.c
cvs rdiff -u -r1.64 -r1.65 src/usr.bin/make/job.h
cvs rdiff -u -r1.157 -r1.158 src/usr.bin/make/meta.c
cvs rdiff -u -r1.8 -r1.9 src/usr.bin/make/meta.h
cvs rdiff -u -r1.21 -r1.22 src/usr.bin/make/trace.c
cvs rdiff -u -r1.8 -r1.9 src/usr.bin/make/unit-tests/opt-debug-jobs.exp

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.204 src/usr.bin/make/compat.c:1.205
--- src/usr.bin/make/compat.c:1.204	Mon Dec  7 01:35:33 2020
+++ src/usr.bin/make/compat.c	Thu Dec 10 20:49:11 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: compat.c,v 1.204 2020/12/07 01:35:33 rillig Exp $	*/
+/*	$NetBSD: compat.c,v 1.205 2020/12/10 20:49:11 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
@@ -96,7 +96,7 @@
 #include "pathnames.h"
 
 /*	"@(#)compat.c	8.2 (Berkeley) 3/19/94"	*/
-MAKE_RCSID("$NetBSD: compat.c,v 1.204 2020/12/07 01:35:33 rillig Exp $");
+MAKE_RCSID("$NetBSD: compat.c,v 1.205 2020/12/10 20:49:11 rillig Exp $");
 
 static GNode *curTarg = NULL;
 static pid_t compatChild;
@@ -409,7 +409,7 @@ Compat_RunCommand(const char *cmdp, GNod
 		if (errCheck) {
 #ifdef USE_META
 			if (useMeta) {
-				meta_job_error(NULL, gn, 0, status);
+				meta_job_error(NULL, gn, FALSE, status);
 			}
 #endif
 			gn->made = ERROR;

Index: src/usr.bin/make/job.c
diff -u src/usr.bin/make/job.c:1.353 src/usr.bin/make/job.c:1.354
--- src/usr.bin/make/job.c:1.353	Thu Dec 10 20:14:35 2020
+++ src/usr.bin/make/job.c	Thu Dec 10 20:49:11 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: job.c,v 1.353 2020/12/10 20:14:35 rillig Exp $	*/
+/*	$NetBSD: job.c,v 1.354 2020/12/10 20:49:11 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
@@ -143,7 +143,7 @@
 #include "trace.h"
 
 /*	"@(#)job.c	8.2 (Berkeley) 3/19/94"	*/
-MAKE_RCSID("$NetBSD: job.c,v 1.353 2020/12/10 20:14:35 rillig Exp $");
+MAKE_RCSID("$NetBSD: job.c,v 1.354 2020/12/10 20:49:11 rillig Exp $");
 
 /*
  * A shell defines how the commands are run.  All commands for a target are
@@ -451,15 +451,27 @@ nfds_per_job(void)
 	return 1;
 }
 
+void
+Job_FlagsToString(char *buf, size_t bufsize, const JobFlags *flags)
+{
+	snprintf(buf, bufsize, "%c%c%c%c",
+	    flags->ignerr ? 'i' : '-',
+	    flags->silent ? 's' : '-',
+	    flags->special ? 'S' : '-',
+	    flags->xtraced ? 'x' : '-');
+}
+
 static void
 job_table_dump(const char *where)
 {
 	Job *job;
+	char flags[5];
 
 	debug_printf("job table @ %s\n", where);
 	for (job = job_table; job < job_table_end; job++) {
-		debug_printf("job %d, status %d, flags %d, pid %d\n",
-		    (int)(job - job_table), job->status, job->flags, job->pid);
+		Job_FlagsToString(flags, sizeof flags, &job->flags);
+		debug_printf("job %d, status %d, flags %s, pid %d\n",
+		    (int)(job - job_table), job->status, flags, job->pid);
 	}
 }
 
@@ -750,7 +762,7 @@ JobPrintln(Job *job, const char *line)
 static void
 JobPrintSpecialsErrCtl(Job *job, Boolean echo)
 {
-	if (!(job->flags & JOB_SILENT) && echo && commandShell->hasEchoCtl) {
+	if (!job->flags.silent && echo && commandShell->hasEchoCtl) {
 		JobPrintln(job, commandShell->echoOff);
 		JobPrintln(job, commandShell->errOffOrExecIgnore);
 		JobPrintln(job, commandShell->echoOn);
@@ -770,9 +782,9 @@ static void
 JobPrintSpecialsEchoCtl(Job *job, RunFlags *inout_runFlags, const char *escCmd,
 			const char **inout_cmdTemplate)
 {
-	job->flags |= JOB_IGNERR;
+	job->flags.ignerr = TRUE;
 
-	if (!(job->flags & JOB_SILENT) && inout_runFlags->echo) {
+	if (!job->flags.silent && inout_runFlags->echo) {
 		if (commandShell->hasEchoCtl)
 			JobPrintln(job, commandShell->echoOff);
 		JobPrintf(job, commandShell->errOnOrEcho, escCmd);
@@ -871,8 +883,7 @@ JobPrintCommand(Job *job, char *cmd)
 		escCmd = EscapeShellDblQuot(cmd);
 
 	if (!runFlags.echo) {
-		if (!(job->flags & JOB_SILENT) && run &&
-		    commandShell->hasEchoCtl) {
+		if (!job->flags.silent && run && commandShell->hasEchoCtl) {
 			JobPrintln(job, commandShell->echoOff);
 		} else {
 			if (commandShell->hasErrCtl)
@@ -892,7 +903,7 @@ JobPrintCommand(Job *job, char *cmd)
 
 		if (!commandShell->hasErrCtl && commandShell->errExit &&
 		    commandShell->errExit[0] != '\0') {
-			if (!(job->flags & JOB_SILENT) && runFlags.echo) {
+			if (!job->flags.silent && runFlags.echo) {
 				if (commandShell->hasEchoCtl)
 					JobPrintln(job, commandShell->echoOff);
 				JobPrintf(job, commandShell->errOnOrEcho,
@@ -913,9 +924,9 @@ JobPrintCommand(Job *job, char *cmd)
 	}
 
 	if (DEBUG(SHELL) && strcmp(shellName, "sh") == 0 &&
-	    !(job->flags & JOB_TRACED)) {
+	    !job->flags.xtraced) {
 		JobPrintln(job, "set -x");
-		job->flags |= JOB_TRACED;
+		job->flags.xtraced = TRUE;
 	}
 
 	JobPrintf(job, cmdTemplate, cmd);
@@ -927,7 +938,7 @@ JobPrintCommand(Job *job, char *cmd)
 		 * echoOff command. Otherwise we issue it and pretend it was on
 		 * for the whole command...
 		 */
-		if (runFlags.echo && !(job->flags & JOB_SILENT) &&
+		if (runFlags.echo && !job->flags.silent &&
 		    commandShell->hasEchoCtl) {
 			JobPrintln(job, commandShell->echoOff);
 			runFlags.echo = FALSE;
@@ -1016,7 +1027,7 @@ JobFinish(Job *job, int status)
 	    job->pid, job->node->name, status);
 
 	if ((WIFEXITED(status) &&
-	     ((WEXITSTATUS(status) != 0 && !(job->flags & JOB_IGNERR)))) ||
+	     ((WEXITSTATUS(status) != 0 && !job->flags.ignerr))) ||
 	    WIFSIGNALED(status)) {
 		/*
 		 * If it exited non-zero and either we're doing things our
@@ -1056,7 +1067,8 @@ JobFinish(Job *job, int status)
 #ifdef USE_META
 				if (useMeta) {
 					meta_job_error(job, job->node,
-					    job->flags, WEXITSTATUS(status));
+					    job->flags.ignerr,
+					    WEXITSTATUS(status));
 				}
 #endif
 				if (!shouldDieQuietly(job->node, -1))
@@ -1064,9 +1076,9 @@ JobFinish(Job *job, int status)
 					    "*** [%s] Error code %d%s\n",
 					    job->node->name,
 					    WEXITSTATUS(status),
-					    (job->flags & JOB_IGNERR)
+					    job->flags.ignerr
 						? " (ignored)" : "");
-				if (job->flags & JOB_IGNERR) {
+				if (job->flags.ignerr) {
 					status = 0;
 				} else {
 					if (deleteOnError) {
@@ -1102,7 +1114,7 @@ JobFinish(Job *job, int status)
 	return_job_token = FALSE;
 
 	Trace_Log(JOBEND, job);
-	if (!(job->flags & JOB_SPECIAL)) {
+	if (!job->flags.special) {
 		if (status != 0 ||
 		    (aborting == ABORT_ERROR) || aborting == ABORT_INTERRUPT)
 			return_job_token = TRUE;
@@ -1117,7 +1129,7 @@ JobFinish(Job *job, int status)
 		 */
 		JobSaveCommands(job);
 		job->node->made = MADE;
-		if (!(job->flags & JOB_SPECIAL))
+		if (!job->flags.special)
 			return_job_token = TRUE;
 		Make_Update(job->node);
 		job->status = JOB_ST_FREE;
@@ -1296,7 +1308,7 @@ JobExec(Job *job, char **argv)
 	int cpid;		/* ID of new child */
 	sigset_t mask;
 
-	job->flags &= ~JOB_TRACED;
+	job->flags.xtraced = FALSE;
 
 	if (DEBUG(JOB)) {
 		int i;
@@ -1315,7 +1327,7 @@ JobExec(Job *job, char **argv)
 	 * banner with their name in it never appears). This is an attempt to
 	 * provide that feedback, even if nothing follows it.
 	 */
-	if (!(job->flags & JOB_SILENT))
+	if (!job->flags.silent)
 		SwitchOutputTo(job->node);
 
 	/* No interruptions until this job is on the `jobs' list */
@@ -1469,9 +1481,9 @@ JobMakeArgv(Job *job, char **argv)
 		 * practically relevant.
 		 */
 		(void)snprintf(args, sizeof args, "-%s%s",
-		    ((job->flags & JOB_IGNERR) ? "" :
+		    (job->flags.ignerr ? "" :
 			(commandShell->exit ? commandShell->exit : "")),
-		    ((job->flags & JOB_SILENT) ? "" :
+		    (job->flags.silent ? "" :
 			(commandShell->echo ? commandShell->echo : "")));
 
 		if (args[1]) {
@@ -1479,11 +1491,11 @@ JobMakeArgv(Job *job, char **argv)
 			argc++;
 		}
 	} else {
-		if (!(job->flags & JOB_IGNERR) && commandShell->exit) {
+		if (!job->flags.ignerr && commandShell->exit) {
 			argv[argc] = UNCONST(commandShell->exit);
 			argc++;
 		}
-		if (!(job->flags & JOB_SILENT) && commandShell->echo) {
+		if (!job->flags.silent && commandShell->echo) {
 			argv[argc] = UNCONST(commandShell->echo);
 			argc++;
 		}
@@ -1512,7 +1524,7 @@ JobMakeArgv(Job *job, char **argv)
  * NB: The return value is ignored by everyone.
  */
 static JobStartResult
-JobStart(GNode *gn, JobFlags flags)
+JobStart(GNode *gn, Boolean special)
 {
 	Job *job;		/* new job descriptor */
 	char *argv[10];		/* Argument vector to shell */
@@ -1532,13 +1544,10 @@ JobStart(GNode *gn, JobFlags flags)
 	job->tailCmds = NULL;
 	job->status = JOB_ST_SET_UP;
 
-	if (gn->type & OP_SPECIAL)
-		flags |= JOB_SPECIAL;
-	if (Targ_Ignore(gn))
-		flags |= JOB_IGNERR;
-	if (Targ_Silent(gn))
-		flags |= JOB_SILENT;
-	job->flags = flags;
+	job->flags.special = special || (gn->type & OP_SPECIAL);
+	job->flags.ignerr = Targ_Ignore(gn);
+	job->flags.silent = Targ_Silent(gn);
+	job->flags.xtraced = FALSE;
 
 	/*
 	 * Check the commands now so any attributes from .DEFAULT have a
@@ -1592,7 +1601,7 @@ JobStart(GNode *gn, JobFlags flags)
 		if (useMeta) {
 			meta_job_start(job, gn);
 			if (Targ_Silent(gn)) /* might have changed */
-				job->flags |= JOB_SILENT;
+				job->flags.silent = TRUE;
 		}
 #endif
 		/* We can do all the commands at once. hooray for sanity */
@@ -1633,7 +1642,7 @@ JobStart(GNode *gn, JobFlags flags)
 		 * good -- it does no harm to keep working up the graph.
 		 */
 		job->cmdFILE = stdout;
-		Job_Touch(gn, (job->flags & JOB_SILENT) != 0);
+		Job_Touch(gn, job->flags.silent);
 		run = FALSE;
 	}
 	/* Just in case it isn't already... */
@@ -1641,7 +1650,7 @@ JobStart(GNode *gn, JobFlags flags)
 
 	/* If we're not supposed to execute a shell, don't. */
 	if (!run) {
-		if (!(job->flags & JOB_SPECIAL))
+		if (!job->flags.special)
 			Job_TokenReturn();
 		/* Unlink and close the command file if we opened one */
 		if (job->cmdFILE != NULL && job->cmdFILE != stdout) {
@@ -2049,7 +2058,7 @@ Job_CatchOutput(void)
 void
 Job_Make(GNode *gn)
 {
-	(void)JobStart(gn, JOB_NONE);
+	(void)JobStart(gn, FALSE);
 }
 
 static void

Index: src/usr.bin/make/job.h
diff -u src/usr.bin/make/job.h:1.64 src/usr.bin/make/job.h:1.65
--- src/usr.bin/make/job.h:1.64	Sun Nov 29 09:27:40 2020
+++ src/usr.bin/make/job.h	Thu Dec 10 20:49:11 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: job.h,v 1.64 2020/11/29 09:27:40 rillig Exp $	*/
+/*	$NetBSD: job.h,v 1.65 2020/12/10 20:49:11 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
@@ -125,17 +125,16 @@ typedef enum JobStatus {
     JOB_ST_FINISHED =	4	/* Job is done (ie after SIGCHILD) */
 } JobStatus;
 
-typedef enum JobFlags {
-    JOB_NONE	= 0,
+typedef struct JobFlags {
     /* Ignore non-zero exits */
-    JOB_IGNERR	= 1 << 0,
+    Boolean ignerr;
     /* no output */
-    JOB_SILENT	= 1 << 1,
+    Boolean silent;
     /* Target is a special one. i.e. run it locally
      * if we can't export it and maxLocal is 0 */
-    JOB_SPECIAL	= 1 << 2,
+    Boolean special;
     /* we've sent 'set -x' */
-    JOB_TRACED	= 1 << 10
+    Boolean xtraced;
 } JobFlags;
 
 /* A Job manages the shell commands that are run to create a single target.
@@ -211,5 +210,6 @@ Boolean Job_TokenWithdraw(void);
 void Job_ServerStart(int, int, int);
 void Job_SetPrefix(void);
 Boolean Job_RunTarget(const char *, const char *);
+void Job_FlagsToString(char *, size_t, const JobFlags *);
 
 #endif /* MAKE_JOB_H */

Index: src/usr.bin/make/meta.c
diff -u src/usr.bin/make/meta.c:1.157 src/usr.bin/make/meta.c:1.158
--- src/usr.bin/make/meta.c:1.157	Sat Dec  5 17:46:41 2020
+++ src/usr.bin/make/meta.c	Thu Dec 10 20:49:11 2020
@@ -1,4 +1,4 @@
-/*      $NetBSD: meta.c,v 1.157 2020/12/05 17:46:41 rillig Exp $ */
+/*      $NetBSD: meta.c,v 1.158 2020/12/10 20:49:11 rillig Exp $ */
 
 /*
  * Implement 'meta' mode.
@@ -772,7 +772,7 @@ meta_job_event(Job *job)
 }
 
 void
-meta_job_error(Job *job, GNode *gn, int flags, int status)
+meta_job_error(Job *job, GNode *gn, Boolean ignerr, int status)
 {
     char cwd[MAXPATHLEN];
     BuildMon *pbm;
@@ -786,9 +786,7 @@ meta_job_error(Job *job, GNode *gn, int 
     }
     if (pbm->mfp != NULL) {
 	fprintf(pbm->mfp, "\n*** Error code %d%s\n",
-		status,
-		(flags & JOB_IGNERR) ?
-		"(ignored)" : "");
+		status, ignerr ? "(ignored)" : "");
     }
     if (gn != NULL) {
 	Var_Set(".ERROR_TARGET", GNode_Path(gn), VAR_GLOBAL);

Index: src/usr.bin/make/meta.h
diff -u src/usr.bin/make/meta.h:1.8 src/usr.bin/make/meta.h:1.9
--- src/usr.bin/make/meta.h:1.8	Mon Oct 19 23:43:55 2020
+++ src/usr.bin/make/meta.h	Thu Dec 10 20:49:11 2020
@@ -1,4 +1,4 @@
-/*      $NetBSD: meta.h,v 1.8 2020/10/19 23:43:55 rillig Exp $ */
+/*      $NetBSD: meta.h,v 1.9 2020/12/10 20:49:11 rillig Exp $ */
 
 /*
  * Things needed for 'meta' mode.
@@ -48,7 +48,7 @@ void meta_job_child(struct Job *);
 void meta_job_parent(struct Job *, pid_t);
 int  meta_job_fd(struct Job *);
 int  meta_job_event(struct Job *);
-void meta_job_error(struct Job *, GNode *, int, int);
+void meta_job_error(struct Job *, GNode *, Boolean, int);
 void meta_job_output(struct Job *, char *, const char *);
 int  meta_cmd_finish(void *);
 int  meta_job_finish(struct Job *);

Index: src/usr.bin/make/trace.c
diff -u src/usr.bin/make/trace.c:1.21 src/usr.bin/make/trace.c:1.22
--- src/usr.bin/make/trace.c:1.21	Sat Oct 31 22:05:56 2020
+++ src/usr.bin/make/trace.c	Thu Dec 10 20:49:11 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: trace.c,v 1.21 2020/10/31 22:05:56 rillig Exp $	*/
+/*	$NetBSD: trace.c,v 1.22 2020/12/10 20:49:11 rillig Exp $	*/
 
 /*-
  * Copyright (c) 2000 The NetBSD Foundation, Inc.
@@ -48,7 +48,7 @@
 #include "job.h"
 #include "trace.h"
 
-MAKE_RCSID("$NetBSD: trace.c,v 1.21 2020/10/31 22:05:56 rillig Exp $");
+MAKE_RCSID("$NetBSD: trace.c,v 1.22 2020/12/10 20:49:11 rillig Exp $");
 
 static FILE *trfile;
 static pid_t trpid;
@@ -92,8 +92,11 @@ Trace_Log(TrEvent event, Job *job)
 	    jobTokensRunning,
 	    evname[event], trpid, trwd);
 	if (job != NULL) {
-		fprintf(trfile, " %s %d %x %x", job->node->name,
-		    job->pid, job->flags, job->node->type);
+		char flags[5];
+
+		Job_FlagsToString(flags, sizeof flags, &job->flags);
+		fprintf(trfile, " %s %d %s %x", job->node->name,
+		    job->pid, flags, job->node->type);
 	}
 	fputc('\n', trfile);
 	fflush(trfile);

Index: src/usr.bin/make/unit-tests/opt-debug-jobs.exp
diff -u src/usr.bin/make/unit-tests/opt-debug-jobs.exp:1.8 src/usr.bin/make/unit-tests/opt-debug-jobs.exp:1.9
--- src/usr.bin/make/unit-tests/opt-debug-jobs.exp:1.8	Thu Nov 19 21:46:10 2020
+++ src/usr.bin/make/unit-tests/opt-debug-jobs.exp	Thu Dec 10 20:49:11 2020
@@ -16,7 +16,7 @@ Running all
 	Command: <shell> 
 JobExec(all): pid <pid> added to jobs table
 job table @ job started
-job 0, status 3, flags 0, pid <pid>
+job 0, status 3, flags ----, pid <pid>
 : expanded expression
 :  variable
 : 'single' and "double" quotes

Reply via email to