| /* |
| * Copyright (c) Meta Platforms, Inc. and affiliates. |
| * All rights reserved. |
| * |
| * This source code is licensed under both the BSD-style license (found in the |
| * LICENSE file in the root directory of this source tree) and the GPLv2 (found |
| * in the COPYING file in the root directory of this source tree). |
| */ |
| #include "utils/ThreadPool.h" |
| |
| #include <gtest/gtest.h> |
| #include <atomic> |
| #include <iostream> |
| #include <thread> |
| #include <vector> |
| |
| using namespace pzstd; |
| |
| TEST(ThreadPool, Ordering) { |
| std::vector<int> results; |
| |
| { |
| ThreadPool executor(1); |
| for (int i = 0; i < 10; ++i) { |
| executor.add([ &results, i ] { results.push_back(i); }); |
| } |
| } |
| |
| for (int i = 0; i < 10; ++i) { |
| EXPECT_EQ(i, results[i]); |
| } |
| } |
| |
| TEST(ThreadPool, AllJobsFinished) { |
| std::atomic<unsigned> numFinished{0}; |
| std::atomic<bool> start{false}; |
| { |
| std::cerr << "Creating executor" << std::endl; |
| ThreadPool executor(5); |
| for (int i = 0; i < 10; ++i) { |
| executor.add([ &numFinished, &start ] { |
| while (!start.load()) { |
| std::this_thread::yield(); |
| } |
| ++numFinished; |
| }); |
| } |
| std::cerr << "Starting" << std::endl; |
| start.store(true); |
| std::cerr << "Finishing" << std::endl; |
| } |
| EXPECT_EQ(10, numFinished.load()); |
| } |
| |
| TEST(ThreadPool, AddJobWhileJoining) { |
| std::atomic<bool> done{false}; |
| { |
| ThreadPool executor(1); |
| executor.add([&executor, &done] { |
| while (!done.load()) { |
| std::this_thread::yield(); |
| } |
| // Sleep for a second to be sure that we are joining |
| std::this_thread::sleep_for(std::chrono::seconds(1)); |
| executor.add([] { |
| EXPECT_TRUE(false); |
| }); |
| }); |
| done.store(true); |
| } |
| } |