Source-Changes-HG archive

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

[src/trunk]: src/usr.bin/make mycroft did not like my O(n^2) lookup algorithm...



details:   https://anonhg.NetBSD.org/src/rev/8726f3c2b47f
branches:  trunk
changeset: 500062:8726f3c2b47f
user:      christos <christos%NetBSD.org@localhost>
date:      Mon Dec 04 17:45:17 2000 +0000

description:
mycroft did not like my O(n^2) lookup algorithm, so I made things much
more complicated.

diffstat:

 usr.bin/make/job.c |  105 ++++++++++++++++++++++++++++++++++------------------
 1 files changed, 69 insertions(+), 36 deletions(-)

diffs (194 lines):

diff -r fecc359534ff -r 8726f3c2b47f usr.bin/make/job.c
--- a/usr.bin/make/job.c        Mon Dec 04 17:26:41 2000 +0000
+++ b/usr.bin/make/job.c        Mon Dec 04 17:45:17 2000 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: job.c,v 1.35 2000/12/03 02:19:32 christos Exp $        */
+/*     $NetBSD: job.c,v 1.36 2000/12/04 17:45:17 christos Exp $        */
 
 /*
  * Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
@@ -39,14 +39,14 @@
  */
 
 #ifdef MAKE_BOOTSTRAP
-static char rcsid[] = "$NetBSD: job.c,v 1.35 2000/12/03 02:19:32 christos Exp $";
+static char rcsid[] = "$NetBSD: job.c,v 1.36 2000/12/04 17:45:17 christos Exp $";
 #else
 #include <sys/cdefs.h>
 #ifndef lint
 #if 0
 static char sccsid[] = "@(#)job.c      8.2 (Berkeley) 3/19/94";
 #else
-__RCSID("$NetBSD: job.c,v 1.35 2000/12/03 02:19:32 christos Exp $");
+__RCSID("$NetBSD: job.c,v 1.36 2000/12/04 17:45:17 christos Exp $");
 #endif
 #endif /* not lint */
 #endif
@@ -246,11 +246,14 @@
 static fd_set          outputs;
 #else
 static struct pollfd *fds = NULL;
+static Job **jobfds = NULL;
 static int nfds = 0;
 static int maxfds = 0;
-static void watchfd __P((int));
-static void clearfd __P((int));
-static int readyfd __P((int));
+static void watchfd __P((Job *));
+static void clearfd __P((Job *));
+static int readyfd __P((Job *));
+#define JBSTART 256
+#define JBINCR 256
 #endif
 #endif
 
@@ -717,14 +720,14 @@
 JobClose(job)
     Job *job;
 {
-    if (usePipes) {
+    if (usePipes && (job->flags & JOB_FIRST)) {
 #ifdef RMT_WILL_WATCH
        Rmt_Ignore(job->inPipe);
 #else
 #ifdef USE_SELECT
        FD_CLR(job->inPipe, &outputs);
 #else
-       clearfd(job->inPipe);
+       clearfd(job);
 #endif
 #endif
        if (job->outPipe != job->inPipe) {
@@ -1320,7 +1323,7 @@
 #endif
        job->pid = cpid;
 
-       if (usePipes && (job->flags & JOB_FIRST) ) {
+       if (usePipes && (job->flags & JOB_FIRST)) {
            /*
             * The first time a job is run for a node, we set the current
             * position in the buffer to the beginning and mark another
@@ -1334,7 +1337,7 @@
 #ifdef USE_SELECT
            FD_SET(job->inPipe, &outputs);
 #else
-           watchfd(job->inPipe);
+           watchfd(job);
 #endif
 #endif /* RMT_WILL_WATCH */
        }
@@ -1745,6 +1748,11 @@
        cmdsOK = TRUE;
     }
 
+#ifndef RMT_WILL_WATCH
+#ifndef USE_SELECT
+    job->inPollfd = NULL;
+#endif
+#endif
     /*
      * If the -n flag wasn't given, we open up OUR (not the child's)
      * temporary file to stuff commands in it. The thing is rd/wr so we don't
@@ -2416,7 +2424,7 @@
 #ifdef USE_SELECT
                if (FD_ISSET(job->inPipe, &readfds))
 #else
-               if (readyfd(job->inPipe))
+               if (readyfd(job))
 #endif
                {
                    JobDoOutput(job, FALSE);
@@ -3203,43 +3211,68 @@
 #ifndef RMT_WILL_WATCH
 #ifndef USE_SELECT
 static void
-watchfd(fd)
-    int fd;
+watchfd(job)
+    Job *job;
 {
-    if (fds == NULL)
-       fds = emalloc(sizeof(struct pollfd) * (maxfds = 256));
-    else if (nfds == maxfds)
-       fds = erealloc(fds, sizeof(struct pollfd) * (maxfds += 256));
+    if (job->inPollfd != NULL)
+       Punt("Watching watched job");
+    if (fds == NULL) {
+       maxfds = JBSTART;
+       fds = emalloc(sizeof(struct pollfd) * maxfds);
+       jobfds = emalloc(sizeof(Job **) * maxfds);
+    } else if (nfds == maxfds) {
+       struct pollfd *newfds;
+       maxfds += JBINCR;
+       newfds = erealloc(fds, sizeof(struct pollfd) * maxfds);
+       jobfds = erealloc(jobfds, sizeof(Job **) * maxfds);
+       if (newfds != fds) {
+           /* Re-thread for the new allocated pointer */
+           LstNode ln;
+           if (Lst_Open(jobs) == FAILURE) {
+               Punt("Cannot open job table");
+           }
+           while ((ln = Lst_Next(jobs)) != NILLNODE) {
+               Job *jb = (Job *) Lst_Datum(ln);
+               int i = jb->inPollfd - fds;
+               jb->inPollfd = &newfds[i];
+               jobfds[i] = jb;
+           }
+           Lst_Close(jobs);
+       }
+       fds = newfds;
+    }
 
-    fds[nfds].fd = fd;
+    fds[nfds].fd = job->inPipe;
+    job->inPollfd = &fds[nfds];
+    jobfds[nfds] = job;
     fds[nfds++].events = POLLIN;
 }
 
 static void
-clearfd(fd)
-    int fd;
+clearfd(job)
+    Job *job;
 {
     int i;
-    for (i = 0; i < nfds; i++)
-       if (fds[i].fd == fd) {
-           nfds--;
-           (void)memcpy(&fds[i], &fds[i+1], (nfds-i) * sizeof(struct pollfd));
-           return;
-       }
-    Punt("File descriptor %d not found in set", fd);
+    if (job->inPollfd == NULL)
+       Punt("Unwatching unwatched job");
+    i = job->inPollfd - fds;
+    nfds--;
+    if (nfds != i) {
+       (void)memcpy(&fds[i], &fds[i + 1], (nfds - i) * sizeof(struct pollfd));
+       (void)memcpy(&jobfds[i], &jobfds[i + 1], (nfds - i) * sizeof(Job *));
+       while (i < nfds)
+            jobfds[i++]->inPollfd--;
+    }
+    job->inPollfd = NULL;
 }
 
 static int
-readyfd(fd)
-    int fd;
+readyfd(job)
+    Job *job;
 {
-    int i;
-    for (i = 0; i < nfds; i++)
-       if (fds[i].fd == fd)
-           return (fds[i].revents & POLLIN) != 0;
-    Punt("File descriptor %d not found in set", fd);
-    /*NOTREACHED*/
-    return -1;
+    if (job->inPollfd == NULL)
+       Punt("Polling unwatched job");
+    return (job->inPollfd->revents & POLLIN) != 0;
 }
 #endif
 #endif



Home | Main Index | Thread Index | Old Index