Module Name: src Committed By: kre Date: Mon Apr 18 06:02:27 UTC 2022
Modified Files: src/bin/sh: jobs.c Log Message: Introduce a new macro JNUM to replace the idiom jp-jobtab+1 (the job number, given jp a pointer to a jobs table entry) used open coded previously in many places (mostly in DEBUG mode trace messages, so not included in most shells, but there are a few others). Make the type of JNUM() be int rather than the ptrdiff_t the open coded version became ... which when used in some printf() type function arg list was cast to some other arbitrary (but not consistent) int type for which there is a standard %Xd type format conversion. Now we can (and do) just use %d for this. If the number of jobs ever exceeds the range of an int, we would have far more serious problems than the broken output this would cause. While here improve a comment or two, and use JOBRUNNING instead of 0 where the intent is the former (JOBRUNNING is #defined as 0). NFCI. To generate a diff of this commit: cvs rdiff -u -r1.115 -r1.116 src/bin/sh/jobs.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/bin/sh/jobs.c diff -u src/bin/sh/jobs.c:1.115 src/bin/sh/jobs.c:1.116 --- src/bin/sh/jobs.c:1.115 Sun Dec 19 21:15:27 2021 +++ src/bin/sh/jobs.c Mon Apr 18 06:02:27 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: jobs.c,v 1.115 2021/12/19 21:15:27 andvar Exp $ */ +/* $NetBSD: jobs.c,v 1.116 2022/04/18 06:02:27 kre Exp $ */ /*- * Copyright (c) 1991, 1993 @@ -37,7 +37,7 @@ #if 0 static char sccsid[] = "@(#)jobs.c 8.5 (Berkeley) 5/4/95"; #else -__RCSID("$NetBSD: jobs.c,v 1.115 2021/12/19 21:15:27 andvar Exp $"); +__RCSID("$NetBSD: jobs.c,v 1.116 2022/04/18 06:02:27 kre Exp $"); #endif #endif /* not lint */ @@ -116,6 +116,8 @@ STATIC void cmdlist(union node *, int); STATIC void cmdputs(const char *); inline static void cmdputi(int); +#define JNUM(j) ((int)((j) != NULL ? ((j) - jobtab) + 1 : 0)) + #ifdef SYSV STATIC int onsigchild(void); #endif @@ -355,7 +357,7 @@ bgcmd(int argc, char **argv) if (jp->jobctl == 0) error("job not created under job control"); set_curjob(jp, 1); - out1fmt("[%ld] %s", (long)(jp - jobtab + 1), jp->ps[0].cmd); + out1fmt("[%d] %s", JNUM(jp), jp->ps[0].cmd); for (i = 1; i < jp->nprocs; i++) out1fmt(" | %s", jp->ps[i].cmd ); out1c('\n'); @@ -403,9 +405,9 @@ restartjob(struct job *jp) for (ps = jp->ps, i = jp->nprocs ; --i >= 0 ; ps++) { if (WIFSTOPPED(ps->status)) { VTRACE(DBG_JOBS, ( - "restartjob: [%zu] pid %d status change" + "restartjob: [%d] pid %d status change" " from %#x (stopped) to -1 (running)\n", - (size_t)(jp-jobtab+1), ps->pid, ps->status)); + JNUM(jp), ps->pid, ps->status)); ps->status = -1; jp->state = JOBRUNNING; } @@ -470,7 +472,7 @@ showjob(struct output *out, struct job * if (mode & SHOW_SIGNALLED && !(mode & SHOW_ISSIG)) { if (jp->state == JOBDONE && !(mode & SHOW_NO_FREE)) { VTRACE(DBG_JOBS, ("showjob: freeing job %d\n", - jp - jobtab + 1)); + JNUM(jp))); freejob(jp); } return; @@ -478,8 +480,8 @@ showjob(struct output *out, struct job * for (ps = jp->ps; --procno >= 0; ps++) { /* for each process */ if (ps == jp->ps) - fmtstr(s, 16, "[%ld] %c ", - (long)(jp - jobtab + 1), + fmtstr(s, 16, "[%d] %c ", + JNUM(jp), #if JOBS jp - jobtab == curjob ? '+' : @@ -948,7 +950,7 @@ jobidcmd(int argc, char **argv) jp = getjob(*argptr, 0); if (job) { - out1fmt("%%%zu\n", (size_t)(jp - jobtab + 1)); + out1fmt("%%%d\n", JNUM(jp)); return 0; } if (pg) { @@ -1157,7 +1159,7 @@ makejob(union node *node, int nprocs) } INTON; VTRACE(DBG_JOBS, ("makejob(%p, %d)%s returns %%%d\n", (void *)node, - nprocs, (jp->flags&JPIPEFAIL)?" PF":"", jp - jobtab + 1)); + nprocs, (jp->flags & JPIPEFAIL) ? " PF" : "", JNUM(jp))); return jp; } @@ -1184,7 +1186,7 @@ forkshell(struct job *jp, union node *n, int serrno; CTRACE(DBG_JOBS, ("forkshell(%%%d, %p, %d) called\n", - jp - jobtab, n, mode)); + JNUM(jp), n, mode)); switch ((pid = fork())) { case -1: @@ -1326,7 +1328,7 @@ waitforjob(struct job *jp) int st; INTOFF; - VTRACE(DBG_JOBS, ("waitforjob(%%%d) called\n", jp - jobtab + 1)); + VTRACE(DBG_JOBS, ("waitforjob(%%%d) called\n", JNUM(jp))); while (jp->state == JOBRUNNING) { dowait(WBLOCK, jp, NULL); } @@ -1352,7 +1354,7 @@ waitforjob(struct job *jp) st = WTERMSIG(status) + 128; VTRACE(DBG_JOBS, ("waitforjob: job %d, nproc %d, status %d, st %x\n", - jp - jobtab + 1, jp->nprocs, status, st)); + JNUM(jp), jp->nprocs, status, st)); #if JOBS if (jp->jobctl) { /* @@ -1402,7 +1404,7 @@ dowait(int flags, struct job *job, struc int err; VTRACE(DBG_JOBS|DBG_PROCS, ("dowait(%x) called for job %d%s\n", - flags, (job ? job-jobtab+1 : 0), changed ? " [report change]":"")); + flags, JNUM(job), changed ? " [report change]" : "")); if (changed != NULL) *changed = NULL; @@ -1458,9 +1460,8 @@ dowait(int flags, struct job *job, struc if (sp->pid == pid && (sp->status==-1 || WIFSTOPPED(sp->status))) { VTRACE(DBG_JOBS | DBG_PROCS, - ("Job %d: changing status of proc %d from %#x to %#x\n", - jp - jobtab + 1, pid, - sp->status, status)); + ("Job %d: changing status of proc %d from %#x to ", + JNUM(jp), pid, sp->status)); /* * If the process continued, @@ -1475,10 +1476,14 @@ dowait(int flags, struct job *job, struc if (sp->status != -1) jp->flags |= JOBCHANGED; sp->status = -1; - jp->state = 0; + jp->state = JOBRUNNING; + VTRACE(DBG_JOBS|DBG_PROCS, + ("running\n")); } else { /* otherwise update status */ sp->status = status; + VTRACE(DBG_JOBS|DBG_PROCS, + ("%#x\n", status)); } /* @@ -1519,7 +1524,7 @@ dowait(int flags, struct job *job, struc if (jp->state != state) { VTRACE(DBG_JOBS, ("Job %d: changing state from %d to %d\n", - jp - jobtab + 1, jp->state, state)); + JNUM(jp), jp->state, state)); jp->state = state; #if JOBS if (done) @@ -1554,8 +1559,8 @@ dowait(int flags, struct job *job, struc VTRACE(DBG_JOBS, ("Not printing status for %p [%d], " "mode=%#x rootshell=%d, job=%p [%d]\n", - thisjob, (thisjob ? (thisjob-jobtab+1) : 0), - mode, rootshell, job, (job ? (job-jobtab+1) : 0))); + thisjob, JNUM(thisjob), mode, rootshell, + job, JNUM(job))); thisjob->flags |= JOBCHANGED; } } @@ -1564,7 +1569,7 @@ dowait(int flags, struct job *job, struc /* * Finally tell our caller that something happened (in general all * anyone tests for is <= 0 (or >0) so the actual pid value here - * doesn't matter much, but we know it is >0 and we may as well + * doesn't matter much, but we know pid is >0 so we may as well * give back something meaningful */ return pid; @@ -1596,7 +1601,7 @@ dowait(int flags, struct job *job, struc * * If neither SYSV nor BSD is defined, we don't implement nonblocking * waits at all. In this case, the user will not be informed when - * a background process until the next time she runs a real program + * a background process ends until the next time she runs a real program * (as opposed to running a builtin command or just typing return), * and the jobs command may give out of date information. */