A 3D game engine from scratch.
1// (c) 2020 Vlad-Stefan Harbuz <vlad@vladh.net>
2
3#include <thread>
4#include "debug.hpp"
5#include "logs.hpp"
6#include "queue.hpp"
7#include "tasks.hpp"
8#include "intrinsics.hpp"
9
10
11tasks::State *tasks::state = nullptr;
12
13
14void
15tasks::push(Task task)
16{
17 tasks::state->task_queue.push(task);
18}
19
20
21void
22tasks::run_loading_loop(
23 std::mutex *mutex,
24 bool *should_stop,
25 u32 idx_thread
26) {
27 while (!*should_stop) {
28 Task *task = nullptr;
29
30 mutex->lock();
31 if (tasks::state->task_queue.size > 0) {
32 task = tasks::state->task_queue.pop();
33 }
34 mutex->unlock();
35
36 if (task) {
37 run_task(task);
38 }
39
40 std::this_thread::sleep_for(std::chrono::milliseconds(1));
41 }
42}
43
44
45void
46tasks::init(tasks::State *tasks_state, memory::Pool *pool)
47{
48 tasks::state = tasks_state;
49 tasks::state->task_queue = Queue<Task>(pool, 128, "task_queue");
50}
51
52
53void
54tasks::run_task(Task *task)
55{
56 auto t0 = debug_start_timer();
57 task->fn(task->argument_1);
58 f64 duration = debug_end_timer(t0);
59 logs::info("Task took %.0fms", duration);
60}