1 // Kernel.cpp: implementation of the CKernel class.
\r
3 //////////////////////////////////////////////////////////////////////
\r
8 //////////////////////////////////////////////////////////////////////
\r
9 // Construction/Destruction
\r
10 //////////////////////////////////////////////////////////////////////
\r
26 int CKernel::Execute()
\r
32 while(taskList.size())
\r
35 PROFILE("Kernel task loop");
\r
37 //DWORD starting_point = GetTickCount();
\r
40 if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
\r
42 TranslateMessage(&msg);
\r
43 DispatchMessage(&msg);
\r
48 std::list< CMMPointer<ITask> >::iterator it, thisIt;
\r
49 for(it=taskList.begin();it!=taskList.end();)
\r
53 if(!t->canKill)t->Update();
\r
55 //loop again to remove dead tasks
\r
56 for(it=taskList.begin();it!=taskList.end();)
\r
63 // 25-07-03 - updated this to use erase() rather than remove()
\r
64 taskList.erase(thisIt);
\r
68 IMMObject::CollectGarbage();
\r
69 //DWORD end_point = GetTickCount();
\r
70 // Sleep(50 - (end_point-starting_point));
\r
73 CProfileSample::Output();
\r
80 bool CKernel::AddTask(const CMMPointer<ITask> &t)
\r
82 if(!t->Start())return false;
\r
84 //keep the order of priorities straight
\r
85 std::list< CMMPointer<ITask> >::iterator it;
\r
86 for(it=taskList.begin();it!=taskList.end();it++)
\r
88 CMMPointer<ITask> &comp=(*it);
\r
89 if(comp->priority>t->priority)break;
\r
91 taskList.insert(it,t);
\r
95 void CKernel::SuspendTask(const CMMPointer<ITask> &t)
\r
97 //check that this task is in our list - we don't want to suspend a task that isn't running
\r
98 if(std::find(taskList.begin(),taskList.end(),t)!=taskList.end())
\r
101 taskList.remove(t);
\r
102 pausedTaskList.push_back(t);
\r
106 void CKernel::ResumeTask(const CMMPointer<ITask> &t)
\r
108 if(std::find(pausedTaskList.begin(),pausedTaskList.end(),t)!=pausedTaskList.end())
\r
111 pausedTaskList.remove(t);
\r
112 //keep the order of priorities straight
\r
113 std::list< CMMPointer<ITask> >::iterator it;
\r
114 for(it=taskList.begin();it!=taskList.end();it++)
\r
116 CMMPointer<ITask> &comp=(*it);
\r
117 if(comp->priority>t->priority)break;
\r
119 taskList.insert(it,t);
\r
123 void CKernel::RemoveTask(const CMMPointer<ITask> &t)
\r
125 if(std::find(taskList.begin(),taskList.end(),t)!=taskList.end())
\r
131 void CKernel::KillAllTasks()
\r
133 for(std::list< CMMPointer<ITask> >::iterator it=taskList.begin();it!=taskList.end();it++)
\r
135 (*it)->canKill=true;
\r