1 // Kernel.cpp: implementation of the CKernel class.
\r
3 //////////////////////////////////////////////////////////////////////
\r
8 //////////////////////////////////////////////////////////////////////
\r
9 // Construction/Destruction
\r
10 //////////////////////////////////////////////////////////////////////
\r
26 int CKernel::Execute()
\r
30 while(taskList.size())
\r
33 PROFILE("Kernel task loop");
\r
35 //DWORD starting_point = GetTickCount();
\r
37 if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
\r
39 TranslateMessage(&msg);
\r
40 DispatchMessage(&msg);
\r
44 std::list< CMMPointer<ITask> >::iterator it, thisIt;
\r
45 for(it=taskList.begin();it!=taskList.end();)
\r
49 if(!t->canKill)t->Update();
\r
51 //loop again to remove dead tasks
\r
52 for(it=taskList.begin();it!=taskList.end();)
\r
59 // 25-07-03 - updated this to use erase() rather than remove()
\r
60 taskList.erase(thisIt);
\r
64 IMMObject::CollectGarbage();
\r
65 //DWORD end_point = GetTickCount();
\r
66 // Sleep(50 - (end_point-starting_point));
\r
69 CProfileSample::Output();
\r
76 bool CKernel::AddTask(CMMPointer<ITask> &t)
\r
78 if(!t->Start())return false;
\r
80 //keep the order of priorities straight
\r
81 std::list< CMMPointer<ITask> >::iterator it;
\r
82 for(it=taskList.begin();it!=taskList.end();it++)
\r
84 CMMPointer<ITask> &comp=(*it);
\r
85 if(comp->priority>t->priority)break;
\r
87 taskList.insert(it,t);
\r
91 void CKernel::SuspendTask(CMMPointer<ITask> &t)
\r
93 //check that this task is in our list - we don't want to suspend a task that isn't running
\r
94 if(std::find(taskList.begin(),taskList.end(),t)!=taskList.end())
\r
98 pausedTaskList.push_back(t);
\r
102 void CKernel::ResumeTask(CMMPointer<ITask> &t)
\r
104 if(std::find(pausedTaskList.begin(),pausedTaskList.end(),t)!=pausedTaskList.end())
\r
107 pausedTaskList.remove(t);
\r
108 //keep the order of priorities straight
\r
109 std::list< CMMPointer<ITask> >::iterator it;
\r
110 for(it=taskList.begin();it!=taskList.end();it++)
\r
112 CMMPointer<ITask> &comp=(*it);
\r
113 if(comp->priority>t->priority)break;
\r
115 taskList.insert(it,t);
\r
119 void CKernel::RemoveTask(CMMPointer<ITask> &t)
\r
121 if(std::find(taskList.begin(),taskList.end(),t)!=taskList.end())
\r
127 void CKernel::KillAllTasks()
\r
129 for(std::list< CMMPointer<ITask> >::iterator it=taskList.begin();it!=taskList.end();it++)
\r
131 (*it)->canKill=true;
\r