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