The open source OpenXR runtime
at prediction 2.4 kB view raw
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}