void CScheduler::WakeTask (CTask **ppTask) { assert (ppTask != 0); CTask *pTask = *ppTask; *ppTask = 0; #ifdef NDEBUG if ( pTask == 0 || pTask->GetState () != TaskStateBlocked) { CLogger::Get ()->Write (FromScheduler, LogPanic, "Tried to wake non-blocked task"); } #else assert (pTask != 0); assert (pTask->GetState () == TaskStateBlocked); #endif pTask->SetState (TaskStateReady); }
unsigned CScheduler::GetNextTask (void) { unsigned nTask = m_nCurrent < MAX_TASKS ? m_nCurrent : 0; for (unsigned i = 1; i <= m_nTasks; i++) { if (++nTask >= m_nTasks) { nTask = 0; } CTask *pTask = m_pTask[nTask]; if (pTask == 0) { continue; } switch (pTask->GetState ()) { case TaskStateReady: return nTask; case TaskStateBlocked: continue; case TaskStateTerminated: RemoveTask (pTask); delete pTask; return MAX_TASKS; default: assert (0); break; } } return MAX_TASKS; }