Source-Changes-HG archive

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

[src/trunk]: src/usr.bin/make Reduce unnecessary calls to waitpid



details:   https://anonhg.NetBSD.org/src/rev/2e7d09e545ea
branches:  trunk
changeset: 950780:2e7d09e545ea
user:      sjg <sjg%NetBSD.org@localhost>
date:      Sun Jan 31 07:07:53 2021 +0000

description:
Reduce unnecessary calls to waitpid

Set a flag when we catch SIGCHLD and
don't call waitpid if it is not set.
Clear it when we call waitpid.

diffstat:

 usr.bin/make/job.c |  12 ++++++++++--
 1 files changed, 10 insertions(+), 2 deletions(-)

diffs (54 lines):

diff -r de37ebf35a8b -r 2e7d09e545ea usr.bin/make/job.c
--- a/usr.bin/make/job.c        Sun Jan 31 06:24:40 2021 +0000
+++ b/usr.bin/make/job.c        Sun Jan 31 07:07:53 2021 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: job.c,v 1.404 2021/01/30 13:12:00 rillig Exp $ */
+/*     $NetBSD: job.c,v 1.405 2021/01/31 07:07:53 sjg 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.404 2021/01/30 13:12:00 rillig Exp $");
+MAKE_RCSID("$NetBSD: job.c,v 1.405 2021/01/31 07:07:53 sjg Exp $");
 
 /*
  * A shell defines how the commands are run.  All commands for a target are
@@ -439,6 +439,7 @@
 };
 
 static sigset_t caught_signals;        /* Set of signals we handle */
+static volatile int caught_sigchld;
 
 static void JobDoOutput(Job *, Boolean);
 static void JobInterrupt(Boolean, int) MAKE_ATTR_DEAD;
@@ -603,6 +604,7 @@
 static void
 JobChildSig(int signo MAKE_ATTR_UNUSED)
 {
+       caught_sigchld = 1;
        while (write(childExitJob.outPipe, CHILD_EXIT, 1) == -1 &&
               errno == EAGAIN)
                continue;
@@ -1972,6 +1974,11 @@
        if (jobTokensRunning == 0)
                return;
 
+       /* Have we received SIGCHLD since last call? */
+       if (caught_sigchld == 0)
+               return;
+       caught_sigchld = 0;
+
        while ((pid = waitpid((pid_t)-1, &status, WNOHANG | WUNTRACED)) > 0) {
                DEBUG2(JOB, "Process %d exited/stopped status %x.\n",
                    pid, status);
@@ -2206,6 +2213,7 @@
        memset(job_table, 0, (size_t)opts.maxJobs * sizeof *job_table);
        job_table_end = job_table + opts.maxJobs;
        wantToken = 0;
+       caught_sigchld = 0;
 
        aborting = ABORT_NONE;
        job_errors = 0;



Home | Main Index | Thread Index | Old Index