static AMInt32 _AMRunTask(_AMTaskMgr* _taskMgr, AMBool isUseThisThread) { if(_taskMgr == AMNULL) return -1; else { AMInt32 index = 0; _AMTask* task = AMNULL; _AMTask* nextRunTask = AMNULL; AMThreadMutexLock(&_taskMgr->mMutex); //find a unrun task. task = _taskMgr->mTasks; while(task != AMNULL) { if(task->mStatus == 0) { nextRunTask = task; break; } task = task->mNext; } if(nextRunTask != AMNULL && isUseThisThread == AMFALSE) { //find a empty thread. for(index = 0; index < _taskMgr->mConcurNum; index++) { if(_taskMgr->mThreadsFlag[index] == 1) { AMThreadWait(_taskMgr->mThreads[index], AMNULL); _taskMgr->mThreads[index] = AMNULL; _taskMgr->mThreadsFlag[index] = 0; } if(_taskMgr->mThreadsFlag[index] == 0) { nextRunTask->mStatus = 1; _taskMgr->mThreadsFlag[index] = 2; nextRunTask->mThreadIndex = index; AMPrintf("Create Thread\n"); AMThreadCreate(&_taskMgr->mThreads[index], AMNULL, _AMRunTaskThreadRun, nextRunTask); break; } } } else if(nextRunTask != AMNULL && isUseThisThread == AMTRUE) { nextRunTask->mStatus = 1; AMThreadMutexUnlock(&_taskMgr->mMutex); AMPrintf("Re use Thread\n"); task->mProc(task->mProcArg); AMThreadMutexLock(&_taskMgr->mMutex); task->mStatus = 2; AMThreadMutexUnlock(&_taskMgr->mMutex); AMTaskMgrRemove((AMTaskMgr*)_taskMgr, (AMTask*)task); return 1; } AMThreadMutexUnlock(&_taskMgr->mMutex); return 0; } }
AMInt32 AMTaskMgrDestory(AMTaskMgr* taskMgr) { _AMTaskMgr* _taskMgr = (_AMTaskMgr*)taskMgr; if(_taskMgr == AMNULL) return -1; else { _AMTask* task = AMNULL; _AMTask* taskNext = AMNULL; AMInt32 index = 0; AMThreadMutexLock(&_taskMgr->mMutex); //Remove all finish and unstarded. task = _taskMgr->mTasks; while(task != AMNULL) { AMInt32 retCode = 0; taskNext = task->mNext; AMTaskMgrRemove((AMTaskMgr*)_taskMgr, (AMTask*)task); task = taskNext; } AMThreadMutexUnlock(&_taskMgr->mMutex); //WaitFor running thread. for(; index < _taskMgr->mConcurNum; index++) { if(_taskMgr->mThreads[index] != AMNULL) { AMThreadWait(_taskMgr->mThreads[index], AMNULL); } } //Remove Form TaskManager. AMThreadMutexLock(&gMutex); AMThreadMutexDestroy(&_taskMgr->mMutex); gTaskMgr[_taskMgr->mId] = AMNULL; gTaskMgrCount--; AMThreadMutexUnlock(&gMutex); _AMTaskMgrUnint(); AMFree(_taskMgr); return 0; } }
Thread::~Thread() { if(tid != NULL) AMThreadWait(tid, NULL); }
void Thread::join() { AMThreadWait(&tid, NULL); isLive = false; }