int32_t OSSim::eventResume(Pid_t cpid, Pid_t pid) { LOG("OSSim::resume(%d,%d)", cpid, pid); ProcessId *proc = ProcessId::getProcessId(pid); if( proc == 0 ) { LOG("OSSim::resume(%d,%d) non existing process???", cpid, pid); return 0; } // Decrement the suspend counter proc->decSuspendedCounter(); // If process is in SuspendedState if(proc->getState()==SuspendedState) { // If the suspend count is not positive if(proc->getSuspendedCounter()<=0) { // Make the process runnable proc->setState(InvalidState); cpus.makeRunnable(proc); } return 1; } else { I(0); LOG("OSSim::resume(%d,%d) OOO suspend/resume (%d)", cpid, pid, proc->getSuspendedCounter()); } return 0; }
int32_t OSSim::eventSuspend(Pid_t cpid, Pid_t pid) { LOG("OSSim::suspend(%d) Received from pid %d",pid,cpid); ProcessId *proc = ProcessId::getProcessId(pid); if( proc == 0 ) { LOG("OSSim::suspend(%d) non existing process???", pid); return 0; } // Increment the suspend counter proc->incSuspendedCounter(); // Check if process already suspended if(proc->getState()==SuspendedState) { I(0); LOG("OSSim::suspend(%d) already suspended (recursive=%d)" , pid, proc->getSuspendedCounter()); return 0; } // The process should be ready or running I((proc->getState()==ReadyState)||(proc->getState()==RunningState)); // Need to suspend only if suspended counter is positive if(proc->getSuspendedCounter()>0) { // The process is no longer runnable cpus.makeNonRunnable(proc); // Set the state to SuspendedState proc->setState(SuspendedState); } else { I(0); LOG("OSSim::suspend(%d,%d) OOO suspend/resume (%d)", cpid, pid, proc->getSuspendedCounter()); } return 1; }