forked from Jenova-Framework/Jenova-Runtime
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtask_system.cpp
More file actions
74 lines (67 loc) · 2.24 KB
/
Copy pathtask_system.cpp
File metadata and controls
74 lines (67 loc) · 2.24 KB
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
/*-------------------------------------------------------------+
| |
| _________ ______ _ _____ |
| / / ____/ | / / __ \ | / / | |
| __ / / __/ / |/ / / / / | / / /| | |
| / /_/ / /___/ /| / /_/ /| |/ / ___ | |
| \____/_____/_/ |_/\____/ |___/_/ |_| |
| |
| Jenova Runtime |
| Developed by Hamid.Memar |
| |
+-------------------------------------------------------------*/
// Jenova SDK
#include "Jenova.hpp"
// Threading SDK
#ifdef TARGET_PLATFORM_WINDOWS
#define PTW32_STATIC_LIB
#define _TIMESPEC_DEFINED
#endif
#include <pthread.h>
// Imports
using TaskID = jenova::TaskID;
using TaskFunction = jenova::TaskFunction;
// Structures
struct Task
{
pthread_t thread;
TaskFunction function;
std::atomic<bool> isDone;
};
// Internal Storage
static std::unordered_map<TaskID, Task> tasks;
static std::mutex taskMutex;
static TaskID nextTaskID = 1;
// Jenova Task System Implementation
TaskID JenovaTaskSystem::InitiateTask(TaskFunction function)
{
std::lock_guard<std::mutex> lock(taskMutex);
TaskID taskID = nextTaskID++;
Task& task = tasks[taskID];
task.function = function;
task.isDone = false;
pthread_create(&task.thread, nullptr, &JenovaTaskSystem::TaskRunner, &task);
return taskID;
}
bool JenovaTaskSystem::IsTaskComplete(TaskID taskID)
{
std::lock_guard<std::mutex> lock(taskMutex);
if (tasks.find(taskID) != tasks.end()) return tasks[taskID].isDone.load();
return false;
}
void JenovaTaskSystem::ClearTask(TaskID taskID)
{
std::lock_guard<std::mutex> lock(taskMutex);
if (tasks.find(taskID) != tasks.end() && tasks[taskID].isDone.load())
{
pthread_join(tasks[taskID].thread, nullptr);
tasks.erase(taskID);
}
}
void* JenovaTaskSystem::TaskRunner(void* taskPtr)
{
Task* task = static_cast<Task*>(taskPtr);
task->function();
task->isDone.store(true);
return nullptr;
}