git subrepo pull (merge) --force deps/libchdr
[pcsx_rearmed.git] / deps / libchdr / deps / zstd-1.5.5 / contrib / pzstd / utils / test / ThreadPoolTest.cpp
CommitLineData
648db22b 1/*
2 * Copyright (c) Meta Platforms, Inc. and affiliates.
3 * All rights reserved.
4 *
5 * This source code is licensed under both the BSD-style license (found in the
6 * LICENSE file in the root directory of this source tree) and the GPLv2 (found
7 * in the COPYING file in the root directory of this source tree).
8 */
9#include "utils/ThreadPool.h"
10
11#include <gtest/gtest.h>
12#include <atomic>
13#include <iostream>
14#include <thread>
15#include <vector>
16
17using namespace pzstd;
18
19TEST(ThreadPool, Ordering) {
20 std::vector<int> results;
21
22 {
23 ThreadPool executor(1);
24 for (int i = 0; i < 10; ++i) {
25 executor.add([ &results, i ] { results.push_back(i); });
26 }
27 }
28
29 for (int i = 0; i < 10; ++i) {
30 EXPECT_EQ(i, results[i]);
31 }
32}
33
34TEST(ThreadPool, AllJobsFinished) {
35 std::atomic<unsigned> numFinished{0};
36 std::atomic<bool> start{false};
37 {
38 std::cerr << "Creating executor" << std::endl;
39 ThreadPool executor(5);
40 for (int i = 0; i < 10; ++i) {
41 executor.add([ &numFinished, &start ] {
42 while (!start.load()) {
43 std::this_thread::yield();
44 }
45 ++numFinished;
46 });
47 }
48 std::cerr << "Starting" << std::endl;
49 start.store(true);
50 std::cerr << "Finishing" << std::endl;
51 }
52 EXPECT_EQ(10, numFinished.load());
53}
54
55TEST(ThreadPool, AddJobWhileJoining) {
56 std::atomic<bool> done{false};
57 {
58 ThreadPool executor(1);
59 executor.add([&executor, &done] {
60 while (!done.load()) {
61 std::this_thread::yield();
62 }
63 // Sleep for a second to be sure that we are joining
64 std::this_thread::sleep_for(std::chrono::seconds(1));
65 executor.add([] {
66 EXPECT_TRUE(false);
67 });
68 });
69 done.store(true);
70 }
71}