int32_t OSSim::eventYield(Pid_t curPid, Pid_t yieldPid) { // LOG("OSSim::yield(%d,%d)", curPid, yieldPid); ProcessId *curProc=ProcessId::getProcessId(curPid); // The current process should be running I(curProc->getState()==RunningState); // get the CPU where the current process is running CPU_t cpu=curProc->getCPU(); // Get the ProcessId of the new process ProcessId *yieldProc; if(yieldPid<0) { // No specific new process, get next ready process yieldProc=ProcessId::queueGet(cpu); } else { // Specific ready process, get its ProcessId yieldProc=ProcessId::getProcessId(yieldPid); // there should be such a process if(!yieldProc) { LOG("OSSim::yield(%d) to non existing process???", yieldPid); return 0; } } // Do nothing if no process to yield to if(!yieldProc) return 1; // Do nothing if the new process already running if(yieldProc->getState()==RunningState) return 1; // The new process should not be suspended if(yieldProc->getState()==SuspendedState) { LOG("OSSim::yield(%d) to a suspended process???", yieldPid); return 0; } // The new process should not be pinned to a other processor if(yieldProc->isPinned()&&(yieldProc->getCPU()!=cpu)) { LOG("OSSim::yield(%d) to a NOMIGRABLE process in another CPU", yieldPid); return 0; } // Remove current process from the processor cpus.switchOut(cpu,curProc); // Put the new process on that processor cpus.switchIn(cpu,yieldProc); return 1; }