* ifdef CKernel::Execute away to make CKernel compile.
[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 #ifdef WIN32\r
29     MSG msg;\r
30 \r
31         while(taskList.size())\r
32         {\r
33                 {\r
34                         PROFILE("Kernel task loop");\r
35 \r
36                         //DWORD starting_point = GetTickCount();\r
37 \r
38         if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))\r
39         {\r
40             TranslateMessage(&msg);\r
41             DispatchMessage(&msg);\r
42         }\r
43 \r
44 \r
45                         std::list< CMMPointer<ITask> >::iterator it, thisIt;\r
46                         for(it=taskList.begin();it!=taskList.end();)\r
47                         {\r
48                                 ITask *t=(*it);\r
49                                 it++;\r
50                                 if(!t->canKill)t->Update();\r
51                         }\r
52                         //loop again to remove dead tasks\r
53                         for(it=taskList.begin();it!=taskList.end();)\r
54                         {\r
55                                 ITask *t=(*it);\r
56                                 thisIt=it; it++;\r
57                                 if(t->canKill)\r
58                                 {\r
59                                         t->Stop();\r
60                                         // 25-07-03 - updated this to use erase() rather than remove()\r
61                                         taskList.erase(thisIt);\r
62                                         t=0;\r
63                                 }\r
64                         }\r
65                         IMMObject::CollectGarbage();\r
66                         //DWORD end_point = GetTickCount();\r
67 //                      Sleep(50 - (end_point-starting_point));\r
68                 }\r
69 #ifdef _DEBUG\r
70                 CProfileSample::Output();\r
71 #endif\r
72         }\r
73 #endif // WIN32\r
74 \r
75         return 0;\r
76 }\r
77 \r
78 bool CKernel::AddTask(CMMPointer<ITask> t)\r
79 {\r
80         if(!t->Start())return false;\r
81 \r
82         //keep the order of priorities straight\r
83         std::list< CMMPointer<ITask> >::iterator it;\r
84         for(it=taskList.begin();it!=taskList.end();it++)\r
85         {\r
86                 CMMPointer<ITask> &comp=(*it);\r
87                 if(comp->priority>t->priority)break;\r
88         }\r
89         taskList.insert(it,t);\r
90         return true;\r
91 }\r
92 \r
93 void CKernel::SuspendTask(CMMPointer<ITask> t)\r
94 {\r
95         //check that this task is in our list - we don't want to suspend a task that isn't running\r
96         if(std::find(taskList.begin(),taskList.end(),t)!=taskList.end())\r
97         {\r
98                 t->OnSuspend();\r
99                 taskList.remove(t);\r
100                 pausedTaskList.push_back(t);\r
101         }\r
102 }\r
103 \r
104 void CKernel::ResumeTask(CMMPointer<ITask> t)\r
105 {\r
106         if(std::find(pausedTaskList.begin(),pausedTaskList.end(),t)!=pausedTaskList.end())\r
107         {\r
108                 t->OnResume();\r
109                 pausedTaskList.remove(t);\r
110                 //keep the order of priorities straight\r
111                 std::list< CMMPointer<ITask> >::iterator it;\r
112                 for(it=taskList.begin();it!=taskList.end();it++)\r
113                 {\r
114                         CMMPointer<ITask> &comp=(*it);\r
115                         if(comp->priority>t->priority)break;\r
116                 }\r
117                 taskList.insert(it,t);\r
118         }\r
119 }\r
120 \r
121 void CKernel::RemoveTask(CMMPointer<ITask> t)\r
122 {\r
123         if(std::find(taskList.begin(),taskList.end(),t)!=taskList.end())\r
124         {\r
125                 t->canKill=true;\r
126         }\r
127 }\r
128 \r
129 void CKernel::KillAllTasks()\r
130 {\r
131         for(std::list< CMMPointer<ITask> >::iterator it=taskList.begin();it!=taskList.end();it++)\r
132         {\r
133                 (*it)->canKill=true;\r
134         }\r
135 }\r