1// tTask.cpp 
2// 
3// Simple and efficient task management using a heap-based priority queue. 
4// 
5// Copyright (c) 2006, 2017 Tristan Grimmer. 
6// Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby 
7// granted, provided that the above copyright notice and this permission notice appear in all copies. 
8// 
9// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL 
10// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 
11// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN 
12// AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 
13// PERFORMANCE OF THIS SOFTWARE. 
14 
15#include "System/tTask.h" 
16 
17 
18tTaskSet::tTaskSet(int64 counterFreq, double maxTimeDelta) : 
19 ExecuteTime(0), 
20 CounterFreq(counterFreq), 
21 MaxTimeDelta(maxTimeDelta), 
22 PriorityQueue(NumTasks, GrowSize
23
24
25 
26 
27tTaskSet::tTaskSet() : 
28 ExecuteTime(0), 
29 CounterFreq(0), 
30 MaxTimeDelta(0), 
31 PriorityQueue(NumTasks, GrowSize
32
33
34 
35 
36void tTaskSet::Update(int64 counter
37
38 bool runningTasks = true
39 while (runningTasks
40
41 if (PriorityQueue.GetNumItems() == 0
42 return
43 
44 if (PriorityQueue.GetMin().Key <= counter
45
46 tPQ<tTask*>::tItem qn = PriorityQueue.GetRemoveMin(); 
47 tTask* t = (tTask*)qn.Data
48 
49 // If there is no function tTask pointer we're all done. The node is already removed from the queue. 
50 if (t
51
52 double td = double(counter - ExecuteTime) / double(CounterFreq); 
53 if (td > MaxTimeDelta
54 td = MaxTimeDelta
55 
56 double nextTime = t->Execute(td); 
57 int64 nextTimeDelta = int64( nextTime*double(CounterFreq) ); 
58 
59 // The 1 guarantees no infinite loop here. 
60 if (nextTimeDelta <= 0
61 nextTimeDelta = 1
62 
63 qn.Key = counter + nextTimeDelta
64 PriorityQueue.Insert(qn); 
65
66
67 else 
68
69 runningTasks = false
70
71
72 
73 ExecuteTime = counter
74
75