forked from sofa-framework/sofa
/
TaskSchedulerTestTasks.cpp
88 lines (61 loc) · 2.09 KB
/
TaskSchedulerTestTasks.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
#include "TaskSchedulerTestTasks.h"
#include <sofa/simulation/TaskScheduler.h>
using sofa::simulation::Task;
namespace sofa
{
Task::MemoryAlloc FibonacciTask::run()
{
if (_N < 2)
{
*_sum = _N;
return MemoryAlloc::Stack;
}
simulation::CpuTask::Status status;
int64_t x, y;
simulation::TaskScheduler* scheduler = simulation::TaskScheduler::getInstance();
FibonacciTask task0(_N - 1, &x, &status);
FibonacciTask task1(_N - 2, &y, &status);
scheduler->addTask(&task0);
scheduler->addTask(&task1);
scheduler->workUntilDone(&status);
// Do the sum
*_sum = x + y;
return MemoryAlloc::Stack;
}
Task::MemoryAlloc IntSumTask::run()
{
const int64_t count = _last - _first;
if (count < 1)
{
*_sum = _first;
return MemoryAlloc::Stack;
}
const int64_t mid = _first + (count / 2);
simulation::CpuTask::Status status;
int64_t x, y;
simulation::TaskScheduler* scheduler = simulation::TaskScheduler::getInstance();
IntSumTask task0(_first, mid, &x, &status);
IntSumTask task1(mid+1, _last, &y, &status);
scheduler->addTask(&task0);
scheduler->addTask(&task1);
scheduler->workUntilDone(&status);
// Do the sum
*_sum = x + y;
return MemoryAlloc::Stack;
}
Task::MemoryAlloc SleepTask::run()
{
using namespace std::chrono_literals;
std::this_thread::sleep_for(20ms);
m_isTaskDone = true;
return Task::Stack;
}
Task::MemoryAlloc ThreadIdTask::run()
{
m_isTaskDone = true;
using namespace std::chrono_literals;
std::this_thread::sleep_for(20ms); //add sleep period to simulate the worker thread is busy
*m_threadId = std::this_thread::get_id();
return Task::Stack;
}
} // namespace sofa