//========- unittests/Support/TaskQueue.cpp - TaskQueue.h tests ------========// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "llvm/Config/llvm-config.h" #if LLVM_ENABLE_THREADS #include "llvm/Support/TaskQueue.h" #include "gtest/gtest.h" using namespace llvm; class TaskQueueTest : public testing::Test { protected: TaskQueueTest() {} }; TEST_F(TaskQueueTest, OrderedFutures) { ThreadPool TP(1); TaskQueue TQ(TP); std::atomic X{ 0 }; std::atomic Y{ 0 }; std::atomic Z{ 0 }; std::mutex M1, M2, M3; std::unique_lock L1(M1); std::unique_lock L2(M2); std::unique_lock L3(M3); std::future F1 = TQ.async([&] { std::unique_lock Lock(M1); ++X; }); std::future F2 = TQ.async([&] { std::unique_lock Lock(M2); ++Y; }); std::future F3 = TQ.async([&] { std::unique_lock Lock(M3); ++Z; }); L1.unlock(); F1.wait(); ASSERT_EQ(1, X); ASSERT_EQ(0, Y); ASSERT_EQ(0, Z); L2.unlock(); F2.wait(); ASSERT_EQ(1, X); ASSERT_EQ(1, Y); ASSERT_EQ(0, Z); L3.unlock(); F3.wait(); ASSERT_EQ(1, X); ASSERT_EQ(1, Y); ASSERT_EQ(1, Z); } TEST_F(TaskQueueTest, UnOrderedFutures) { ThreadPool TP(1); TaskQueue TQ(TP); std::atomic X{ 0 }; std::atomic Y{ 0 }; std::atomic Z{ 0 }; std::mutex M; std::unique_lock Lock(M); std::future F1 = TQ.async([&] { ++X; }); std::future F2 = TQ.async([&] { ++Y; }); std::future F3 = TQ.async([&M, &Z] { std::unique_lock Lock(M); ++Z; }); F2.wait(); ASSERT_EQ(1, X); ASSERT_EQ(1, Y); ASSERT_EQ(0, Z); Lock.unlock(); F3.wait(); ASSERT_EQ(1, X); ASSERT_EQ(1, Y); ASSERT_EQ(1, Z); } TEST_F(TaskQueueTest, FutureWithReturnValue) { ThreadPool TP(1); TaskQueue TQ(TP); std::future F1 = TQ.async([&] { return std::string("Hello"); }); std::future F2 = TQ.async([&] { return 42; }); ASSERT_EQ(42, F2.get()); ASSERT_EQ("Hello", F1.get()); } #endif