pid_t proc_get_random_pid(void) { pid_t last_maxproc, newpid; int count = 0, iterations = 0; KERROR_DBG("%s()\n", __func__); PROC_LOCK(); last_maxproc = configMAXPROC; newpid = last_maxproc; /* * The new PID will be "randomly" selected between proc_lastpid and * maxproc. */ do { long d = last_maxproc - proc_lastpid - 1; if (d <= 1 || count == 20) { proc_lastpid = 2; count = 0; continue; } if (newpid + 1 > last_maxproc) newpid = proc_lastpid + kunirand(d); newpid++; count++; if (iterations++ > 10000) { /* Just try to find any sufficient PID. */ iterations = 0; for (pid_t pid = 2; pid <= configMAXPROC; pid++) { if (!proc_exists_locked(newpid)) { newpid = pid; break; } } } } while (proc_exists_locked(newpid)); proc_lastpid = newpid; PROC_UNLOCK(); KERROR_DBG("%s done\n", __func__); return newpid; }
static pid_t proc_get_next_pid(void) { const pid_t pid_reset = (configMAXPROC < 20) ? 2 : (configMAXPROC < 200) ? configMAXPROC / 2 : 100; pid_t newpid = (proc_lastpid >= configMAXPROC) ? pid_reset : proc_lastpid + 1; KERROR_DBG("%s()\n", __func__); PROC_LOCK(); while (proc_exists_locked(newpid)) { newpid++; if (newpid > configMAXPROC) { newpid = pid_reset; } } proc_lastpid = newpid; PROC_UNLOCK(); KERROR_DBG("%s done\n", __func__); return newpid; }