The open source OpenXR runtime
1// Copyright 2022, Collabora, Ltd.
2// SPDX-License-Identifier: BSL-1.0
3/*!
4 * @file
5 * @brief Thread pool tests.
6 * @author Rylie Pavlik <rylie.pavlik@collabora.com>
7 */
8
9#include <util/u_worker.hpp>
10
11#include "catch_amalgamated.hpp"
12
13#include <thread>
14#include <chrono>
15
16using namespace std::chrono_literals;
17
18
19using namespace xrt::auxiliary::util;
20
21TEST_CASE("TaskCollection")
22{
23 SharedThreadPool pool{2, 3, "Test"};
24 bool calledA[] = {
25 false,
26 false,
27 false,
28 };
29
30 bool calledB[] = {
31 false,
32 false,
33 false,
34 };
35
36 std::vector<TaskCollection::Functor> funcsA = {
37 [&] { calledA[0] = true; },
38 [&] { calledA[1] = true; },
39 [&] { calledA[2] = true; },
40 };
41
42 std::vector<TaskCollection::Functor> funcsB = {
43 [&] { calledB[0] = true; },
44 [&] { calledB[1] = true; },
45 [&] { calledB[2] = true; },
46 };
47
48 SharedThreadGroup groupA{pool};
49 SharedThreadGroup groupB{pool};
50
51 CHECK(!calledA[0]);
52 CHECK(!calledA[1]);
53 CHECK(!calledA[2]);
54
55 TaskCollection collectionA{groupA, funcsA};
56
57 SECTION("Sequential wait")
58 {
59 collectionA.waitAll();
60 CHECK(calledA[0]);
61 CHECK(calledA[1]);
62 CHECK(calledA[2]);
63
64 CHECK(!calledB[0]);
65 CHECK(!calledB[1]);
66 CHECK(!calledB[2]);
67
68 {
69 TaskCollection collectionB{groupB, funcsB};
70 }
71 CHECK(calledB[0]);
72 CHECK(calledB[1]);
73 CHECK(calledB[2]);
74 }
75
76 SECTION("Simultaneous dispatch, reversed wait")
77 {
78 CHECK(!calledB[0]);
79 CHECK(!calledB[1]);
80 CHECK(!calledB[2]);
81
82 {
83 TaskCollection collectionB{groupB, funcsB};
84 }
85
86 CHECK(calledB[0]);
87 CHECK(calledB[1]);
88 CHECK(calledB[2]);
89
90 collectionA.waitAll();
91 CHECK(calledA[0]);
92 CHECK(calledA[1]);
93 CHECK(calledA[2]);
94 }
95
96
97 SECTION("Simultaneous dispatch, reversed wait")
98 {
99 CHECK(!calledB[0]);
100 CHECK(!calledB[1]);
101 CHECK(!calledB[2]);
102
103 {
104 TaskCollection collectionB{
105 groupB,
106 {
107 [&] {
108 std::this_thread::sleep_for(500ms);
109 calledB[0] = true;
110 },
111 [&] {
112 std::this_thread::sleep_for(500ms);
113 calledB[1] = true;
114 },
115 [&] {
116 std::this_thread::sleep_for(500ms);
117 calledB[2] = true;
118 },
119 },
120 };
121 }
122
123 CHECK(calledB[0]);
124 CHECK(calledB[1]);
125 CHECK(calledB[2]);
126
127 collectionA.waitAll();
128 CHECK(calledA[0]);
129 CHECK(calledA[1]);
130 CHECK(calledA[2]);
131 }
132}