* Add link target to the Makefile.
[matthijs/ABM2.git] / ABM2 / Engine / Kernel.cpp
1 // Kernel.cpp: implementation of the CKernel class.\r
2 //\r
3 //////////////////////////////////////////////////////////////////////\r
4 \r
5 #include "engine.h"\r
6 #include "Kernel.h"\r
7 \r
8 //////////////////////////////////////////////////////////////////////\r
9 // Construction/Destruction\r
10 //////////////////////////////////////////////////////////////////////\r
11 \r
12 CKernel::CKernel()\r
13 {\r
14 //      SDL_Init(0);\r
15         //SDLNet_Init();\r
16 }\r
17 \r
18 CKernel::~CKernel()\r
19 {\r
20         \r
21 \r
22         //SDLNet_Quit();\r
23 //      SDL_Quit();\r
24 }\r
25 \r
26 int CKernel::Execute()\r
27 {\r
28     MSG msg;\r
29 \r
30         while(taskList.size())\r
31         {\r
32                 {\r
33                         PROFILE("Kernel task loop");\r
34 \r
35                         //DWORD starting_point = GetTickCount();\r
36 \r
37         if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))\r
38         {\r
39             TranslateMessage(&msg);\r
40             DispatchMessage(&msg);\r
41         }\r
42 \r
43 \r
44                         std::list< CMMPointer<ITask> >::iterator it, thisIt;\r
45                         for(it=taskList.begin();it!=taskList.end();)\r
46                         {\r
47                                 ITask *t=(*it);\r
48                                 it++;\r
49                                 if(!t->canKill)t->Update();\r
50                         }\r
51                         //loop again to remove dead tasks\r
52                         for(it=taskList.begin();it!=taskList.end();)\r
53                         {\r
54                                 ITask *t=(*it);\r
55                                 thisIt=it; it++;\r
56                                 if(t->canKill)\r
57                                 {\r
58                                         t->Stop();\r
59                                         // 25-07-03 - updated this to use erase() rather than remove()\r
60                                         taskList.erase(thisIt);\r
61                                         t=0;\r
62                                 }\r
63                         }\r
64                         IMMObject::CollectGarbage();\r
65                         //DWORD end_point = GetTickCount();\r
66 //                      Sleep(50 - (end_point-starting_point));\r
67                 }\r
68 #ifdef _DEBUG\r
69                 CProfileSample::Output();\r
70 #endif\r
71         }\r
72 \r
73         return 0;\r
74 }\r
75 \r
76 bool CKernel::AddTask(CMMPointer<ITask> t)\r
77 {\r
78         if(!t->Start())return false;\r
79 \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
83         {\r
84                 CMMPointer<ITask> &comp=(*it);\r
85                 if(comp->priority>t->priority)break;\r
86         }\r
87         taskList.insert(it,t);\r
88         return true;\r
89 }\r
90 \r
91 void CKernel::SuspendTask(CMMPointer<ITask> t)\r
92 {\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
95         {\r
96                 t->OnSuspend();\r
97                 taskList.remove(t);\r
98                 pausedTaskList.push_back(t);\r
99         }\r
100 }\r
101 \r
102 void CKernel::ResumeTask(CMMPointer<ITask> t)\r
103 {\r
104         if(std::find(pausedTaskList.begin(),pausedTaskList.end(),t)!=pausedTaskList.end())\r
105         {\r
106                 t->OnResume();\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
111                 {\r
112                         CMMPointer<ITask> &comp=(*it);\r
113                         if(comp->priority>t->priority)break;\r
114                 }\r
115                 taskList.insert(it,t);\r
116         }\r
117 }\r
118 \r
119 void CKernel::RemoveTask(CMMPointer<ITask> t)\r
120 {\r
121         if(std::find(taskList.begin(),taskList.end(),t)!=taskList.end())\r
122         {\r
123                 t->canKill=true;\r
124         }\r
125 }\r
126 \r
127 void CKernel::KillAllTasks()\r
128 {\r
129         for(std::list< CMMPointer<ITask> >::iterator it=taskList.begin();it!=taskList.end();it++)\r
130         {\r
131                 (*it)->canKill=true;\r
132         }\r
133 }\r