int uthread_suspend(int tid) { blockTimer(); if(tid == 0) { std::cerr<< BLOCK_ERR_MAIN <<std::endl; resumeTimer(); return FAILURE; } if(gThreads.count(tid) == 0) { std::cerr << BLOCK_ERR << " Thread does not exist." << std::endl; resumeTimer(); return FAILURE; } Thread* tmp = gThreads[tid]; if(tmp->getState() == BLOCKED ) { // no effect resumeTimer(); return SUCCESS; } if(tmp->getState() == RUNNING ) { // make scheduling decision (move to next thread) switchThreads(BLOCKED); resumeTimer(); return SUCCESS; } if(tmp->getState() == READY ) { // move to gBlocked + update state in thread gReady.remove(tid); gBlocked[tid] = tmp; tmp->setState(BLOCKED); resumeTimer(); return SUCCESS; } std::cerr << BLOCK_ERR << std::endl; resumeTimer(); return FAILURE; }
int uthread_terminate(int tid) { blockTimer(); if(tid == 0)//if true: exits program { // terminate all threads: std::map<int, Thread*>::iterator threadIt; for (threadIt = gThreads.begin(); threadIt != gThreads.end(); ++threadIt) { Thread* tmp; switch(threadIt->second->getState() ) { case(READY) : gReady.remove(threadIt->second->getID() ); tmp = gThreads[threadIt->second->getID() ]; gThreads.erase(threadIt); delete tmp; break; case(RUNNING) : gThreads.erase(threadIt); // gRunning = NULL; break; case(BLOCKED) : gBlocked.erase(threadIt->second->getID() ); tmp = gThreads[threadIt->second->getID() ]; gThreads.erase(threadIt); delete tmp; break; default : break; } } delete gRunning; gRunning = NULL; resumeTimer(); exit(0); } if(gThreads.count(tid) == 0) //if true: thread doesn't exist { std::cerr<< TERMINATE_ERR << std::endl; resumeTimer(); return FAILURE; } if(gThreads[tid]->getState() == RUNNING)//if true: deletes thread + jumps to next thread { switchThreads(TERMINATED); } // if in ready or blocked: remove from lists (gReady/gBlocked + gThreads), and delete thread Thread* tmp = gThreads[tid]; if (tmp->getState() == READY ) { gReady.remove(tid); } if (tmp->getState() == BLOCKED) { gBlocked.erase(tid); } gThreads.erase(tid); gAvailableID.push(tid); delete tmp; resumeTimer(); return SUCCESS; }