GCC Code Coverage Report


Directory: src/gate/
File: src/gate/tests/gatecore_cpp_test/test_threadpools.cpp
Date: 2025-09-14 13:10:38
Exec Total Coverage
Lines: 59 59 100.0%
Functions: 13 13 100.0%
Branches: 105 289 36.3%

Line Branch Exec Source
1 #include "gate/tests.hpp"
2 #include "gate/threadpools.hpp"
3 #include "gate/threading.hpp"
4 #include "gate/atomics.hpp"
5
6 using namespace gate;
7
8
9 class GATE_API_LOCAL ThreadRunnable : public IRunnable
10 {
11 public:
12 int current_value;
13 int future_value;
14
15 1 ThreadRunnable() : current_value(0), future_value(1) {}
16
17 1 void run() override
18 {
19 1 this->current_value = this->future_value;
20 1 }
21 };
22
23 static ThreadRunnable global_thread_runnable;
24
25 1 static void do_nothing()
26 {
27 1 }
28
29
2/7
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
6 GATEXX_TEST_UNIT(Thread)
30 {
31 2 Thread::id_t thid = 0;
32
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Thread::handle_t th = Thread::self(&thid);
33 (void)th;
34
4/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
2 GATEXX_TEST_CHECK(thid != 0);
35
36
4/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
2 GATEXX_TEST_CHECK_NOTHROW(Thread::yield());
37
4/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
2 GATEXX_TEST_CHECK_NOTHROW(Thread::yieldIfPreemptive());
38
39 static Thread::id_t const invalid_thread_id = static_cast<Thread::id_t>(-1);
40
41 {
42
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 Thread th;
43 2 global_thread_runnable.current_value = 0;
44 2 global_thread_runnable.future_value = 42;
45
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Thread::id_t new_thid = th.start(global_thread_runnable);
46
4/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
2 GATEXX_TEST_CHECK_NOT_EQUAL(new_thid, invalid_thread_id);
47
5/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
2 GATEXX_TEST_CHECK_OK(th.join());
48
4/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
2 GATEXX_TEST_CHECK_EQUAL(global_thread_runnable.current_value, global_thread_runnable.future_value);
49 }
50
51 {
52
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 Runnable r = RunnableFunction::create(&do_nothing);
53
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 Thread th;
54
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Thread::id_t thid = th.start(r);
55
4/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
2 GATEXX_TEST_CHECK_NOT_EQUAL(thid, invalid_thread_id);
56 2 th.release();
57 }
58 2 }
59
60 static int dummy = 42;
61
62
2/7
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
6 GATEXX_TEST_UNIT(ThreadStorage)
63 {
64
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 ThreadStorage ts;
65
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 VoidResult vr = ts.trySet(&dummy);
66
4/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
2 GATEXX_TEST_CHECK(!vr.hasError());
67
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 Result<void*> pv = ts.tryGet();
68
4/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
2 GATEXX_TEST_CHECK(!pv.hasError());
69
4/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
2 GATEXX_TEST_CHECK_EQUAL(pv.value(), &dummy);
70
71
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 ts.set(NULL);
72
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 void* nptr = ts.get();
73
4/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
2 GATEXX_TEST_CHECK_EQUAL(nptr, NULL);
74 2 }
75
76 static AtomicInt global_shared_state = 0;
77
78 1 static void pool_task_set_state()
79 {
80 1 global_shared_state.set(1);
81 1 }
82
83
2/7
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
6 GATEXX_TEST_UNIT(Threadpool)
84 {
85
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 ThreadPool pool;
86
5/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
2 GATEXX_TEST_CHECK(pool.c_impl() != NULL);
87 2 global_shared_state.set(0);
88
89
5/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
2 GATEXX_TEST_CHECK_EQUAL(pool.getPendingTasksCount(), 0);
90
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 Runnable task = RunnableFunction::create(&pool_task_set_state);
91
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 pool.addTask(task);
92
5/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
2 GATEXX_TEST_CHECK_EQUAL(pool.getPendingTasksCount(), 1);
93
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 pool.removeTask(task);
94
5/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
2 GATEXX_TEST_CHECK_EQUAL(pool.getPendingTasksCount(), 0);
95
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 pool.addTask(task);
96
5/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
2 GATEXX_TEST_CHECK_EQUAL(pool.getPendingTasksCount(), 1);
97
98
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 pool.start();
99
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
4 for (int n = 0; n < 1000; ++n)
100 {
101
2/2
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
4 if (global_shared_state.get() != 0)
102 {
103 2 break;
104 }
105
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Thread::sleep(10);
106 }
107
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 pool.stop();
108
4/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
2 GATEXX_TEST_CHECK_EQUAL(global_shared_state.get(), 1);
109 2 }
110
111