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 if we didn't use up too much time already */
\r
71 if (starting_point + 50 > end_point)
\r
72 Sleep(50 - (end_point-starting_point));
\r
75 CProfileSample::Output();
\r
82 bool CKernel::AddTask(const CMMPointer<ITask> &t)
\r
84 if(!t->Start())return false;
\r
86 //keep the order of priorities straight
\r
87 std::list< CMMPointer<ITask> >::iterator it;
\r
88 for(it=taskList.begin();it!=taskList.end();it++)
\r
90 CMMPointer<ITask> &comp=(*it);
\r
91 if(comp->priority>t->priority)break;
\r
93 taskList.insert(it,t);
\r
97 void CKernel::SuspendTask(const CMMPointer<ITask> &t)
\r
99 //check that this task is in our list - we don't want to suspend a task that isn't running
\r
100 if(std::find(taskList.begin(),taskList.end(),t)!=taskList.end())
\r
103 taskList.remove(t);
\r
104 pausedTaskList.push_back(t);
\r
108 void CKernel::ResumeTask(const CMMPointer<ITask> &t)
\r
110 if(std::find(pausedTaskList.begin(),pausedTaskList.end(),t)!=pausedTaskList.end())
\r
113 pausedTaskList.remove(t);
\r
114 //keep the order of priorities straight
\r
115 std::list< CMMPointer<ITask> >::iterator it;
\r
116 for(it=taskList.begin();it!=taskList.end();it++)
\r
118 CMMPointer<ITask> &comp=(*it);
\r
119 if(comp->priority>t->priority)break;
\r
121 taskList.insert(it,t);
\r
125 void CKernel::RemoveTask(const CMMPointer<ITask> &t)
\r
127 if(std::find(taskList.begin(),taskList.end(),t)!=taskList.end())
\r
133 void CKernel::KillAllTasks()
\r
135 for(std::list< CMMPointer<ITask> >::iterator it=taskList.begin();it!=taskList.end();it++)
\r
137 (*it)->canKill=true;
\r