- for (rpp = proc; rpp < procNPROC; rpp++) {
- if (rpp->p_stat == NULL && p==NULL)
- p = rpp;
- if (rpp->p_pid==mpid || rpp->p_pgrp==mpid)
- goto retry;
+ if (mpid >= pidchecked) {
+ int doingzomb = 0;
+
+ pidchecked = 30000;
+ /*
+ * Scan the proc table to check whether this pid
+ * is in use. Remember the lowest pid that's greater
+ * than mpid, so we can avoid checking for a while.
+ */
+ rpp = allproc;
+again:
+ for (; rpp != NULL; rpp = rpp->p_nxt) {
+ if (rpp->p_pid == mpid || rpp->p_pgrp == mpid) {
+ mpid++;
+ if (mpid >= pidchecked)
+ goto retry;
+ }
+ if (rpp->p_pid > mpid && pidchecked > rpp->p_pid)
+ pidchecked = rpp->p_pid;
+ if (rpp->p_pgrp > mpid && pidchecked > rpp->p_pgrp)
+ pidchecked = rpp->p_pgrp;
+ }
+ if (!doingzomb) {
+ doingzomb = 1;
+ rpp = zombproc;
+ goto again;
+ }