/
task.cpp
94 lines (73 loc) · 1.98 KB
/
task.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/* task.cpp -- abstraction for task-based work queues
*
* Ryan McDougall
*/
#include "stdheaders.hpp"
#include "task.hpp"
//=============================================================================
//
namespace Scaffold
{
namespace Framework
{
Task::Task (Callable t) :
work (t)
{}
Task *Task::chain (Task *t)
{
dependants.push_back (t);
return this;
}
Scheduler::Scheduler ()
{
}
void Scheduler::enqueue (Task *task)
{
Locker mtx (queue_lock_);
enqueue_ (task);
}
void Scheduler::enqueue (const Task::List &list)
{
Locker mtx (queue_lock_);
enqueue_ (list);
}
void Scheduler::dispatch (frame_delta_t delta)
{
if (queue_.size())
{
Task *head = queue_.front();
if (execute_ (head, delta) && head->dependants.size())
enqueue_ (head->dependants);
dispose_ (head);
queue_.pop_front();
}
}
int Scheduler::length ()
{
return queue_.size();
}
void Scheduler::enqueue_ (Task *task)
{
task->state = Task::READY;
queue_.push_back (task);
}
void Scheduler::enqueue_ (const Task::List &list)
{
Task::List::const_iterator i = list.begin();
Task::List::const_iterator e = list.end();
for (; i != e; ++i) enqueue_ (*i);
}
bool Scheduler::execute_ (Task *head, frame_delta_t delta)
{
head->state = Task::RUNNING;
bool result = head->work (delta);
head->state = Task::COMPLETE;
return result;
}
void Scheduler::dispose_ (Task *head)
{
head->state = Task::FINAL;
delete head;
}
}
}