/* * 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 #include #include #include #include using namespace pzstd; TEST(ThreadPool, Ordering) { std::vector 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 numFinished{0}; std::atomic 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 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); } }