コード例 #1
0
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;
}
コード例 #2
0
ファイル: proc_fork.c プロジェクト: Zeke-OS/zeke
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;
}