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; }