Beispiel #1
0
void OSSim::setPriority(Pid_t pid, int32_t newPrio)
{
    ProcessId *proc = ProcessId::getProcessId(pid);
    I(proc);

    int32_t oldPrio=proc->getPriority();

    if(newPrio==oldPrio)
        return;

    // Set the new priority of the process
    ProcessId *otherProc=proc->setPriority(newPrio);
    if(newPrio>oldPrio) {
        // Priority is better now, check if still running
        if(proc->getState()==RunningState) {
            // Is there a process we need to swap with
            if(otherProc) {
                // Get the cpu where the demoted process is running
                CPU_t cpu=proc->getCPU();
                // Switch the demoted process out
                cpus.switchOut(cpu,proc);
                // Switch the new process in
                cpus.switchIn(cpu,otherProc);
            }
        }
    } else {
        // Priority is worse now, check if ready but not already running
        if(proc->getState()==ReadyState) {
            // Is there a process we need to swap with
            if(otherProc) {
                // Get the cpu where the other process is running
                CPU_t cpu=otherProc->getCPU();
                // Switch the victim process out
                cpus.switchOut(cpu,otherProc);
                // Switch the promoted process in
                cpus.switchIn(cpu,proc);
            }
        }
    }
}