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