Something went wrong. Try again.
The open source OpenXR runtime
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133// Copyright 2022, Collabora, Ltd.// SPDX-License-Identifier: BSL-1.0/*! * @file * @brief Thread pool tests. * @author Rylie Pavlik <rylie.pavlik@collabora.com> */
#include <util/u_worker.hpp>
#include "catch_amalgamated.hpp"
#include <thread>#include <chrono>
using namespace std::chrono_literals;
using namespace xrt::auxiliary::util;
TEST_CASE("TaskCollection"){ SharedThreadPool pool{2, 3, "Test"}; bool calledA[] = { false, false, false, };
bool calledB[] = { false, false, false, };
std::vector<TaskCollection::Functor> funcsA = { [&] { calledA[0] = true; }, [&] { calledA[1] = true; }, [&] { calledA[2] = true; }, };
std::vector<TaskCollection::Functor> funcsB = { [&] { calledB[0] = true; }, [&] { calledB[1] = true; }, [&] { calledB[2] = true; }, };
SharedThreadGroup groupA{pool}; SharedThreadGroup groupB{pool};
CHECK(!calledA[0]); CHECK(!calledA[1]); CHECK(!calledA[2]);
TaskCollection collectionA{groupA, funcsA};
SECTION("Sequential wait") { collectionA.waitAll(); CHECK(calledA[0]); CHECK(calledA[1]); CHECK(calledA[2]);
CHECK(!calledB[0]); CHECK(!calledB[1]); CHECK(!calledB[2]);
{ TaskCollection collectionB{groupB, funcsB}; } CHECK(calledB[0]); CHECK(calledB[1]); CHECK(calledB[2]); }
SECTION("Simultaneous dispatch, reversed wait") { CHECK(!calledB[0]); CHECK(!calledB[1]); CHECK(!calledB[2]);
{ TaskCollection collectionB{groupB, funcsB}; }
CHECK(calledB[0]); CHECK(calledB[1]); CHECK(calledB[2]);
collectionA.waitAll(); CHECK(calledA[0]); CHECK(calledA[1]); CHECK(calledA[2]); }
SECTION("Simultaneous dispatch, reversed wait") { CHECK(!calledB[0]); CHECK(!calledB[1]); CHECK(!calledB[2]);
{ TaskCollection collectionB{ groupB, { [&] { std::this_thread::sleep_for(500ms); calledB[0] = true; }, [&] { std::this_thread::sleep_for(500ms); calledB[1] = true; }, [&] { std::this_thread::sleep_for(500ms); calledB[2] = true; }, }, }; }
CHECK(calledB[0]); CHECK(calledB[1]); CHECK(calledB[2]);
collectionA.waitAll(); CHECK(calledA[0]); CHECK(calledA[1]); CHECK(calledA[2]); }}