summaryrefslogtreecommitdiff
path: root/contrib/pzstd/utils/test/ThreadPoolTest.cpp
diff options
context:
space:
mode:
authorBaptiste Daroussin <bapt@FreeBSD.org>2017-04-15 19:47:16 +0000
committerBaptiste Daroussin <bapt@FreeBSD.org>2017-04-15 19:47:16 +0000
commita19eddc34b6e8db043dbf6180c90e9bbe531dc03 (patch)
treec1a7236f0695eb15e345486c8c85a1889b661ce8 /contrib/pzstd/utils/test/ThreadPoolTest.cpp
Notes
Diffstat (limited to 'contrib/pzstd/utils/test/ThreadPoolTest.cpp')
-rw-r--r--contrib/pzstd/utils/test/ThreadPoolTest.cpp67
1 files changed, 67 insertions, 0 deletions
diff --git a/contrib/pzstd/utils/test/ThreadPoolTest.cpp b/contrib/pzstd/utils/test/ThreadPoolTest.cpp
new file mode 100644
index 000000000000..1d857aae808d
--- /dev/null
+++ b/contrib/pzstd/utils/test/ThreadPoolTest.cpp
@@ -0,0 +1,67 @@
+/**
+ * Copyright (c) 2016-present, Facebook, Inc.
+ * All rights reserved.
+ *
+ * This source code is licensed under the BSD-style license found in the
+ * LICENSE file in the root directory of this source tree. An additional grant
+ * of patent rights can be found in the PATENTS file in the same directory.
+ */
+#include "utils/ThreadPool.h"
+
+#include <gtest/gtest.h>
+#include <atomic>
+#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};
+ {
+ ThreadPool executor(5);
+ for (int i = 0; i < 10; ++i) {
+ executor.add([ &numFinished, &start ] {
+ while (!start.load()) {
+ // spin
+ }
+ ++numFinished;
+ });
+ }
+ start.store(true);
+ }
+ 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);
+ }
+}