1 /*
2 * Copyright (c) 2016-present, Facebook, Inc.
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/ResourcePool.h"
10
11 #include <gtest/gtest.h>
12 #include <atomic>
13 #include <thread>
14
15 using namespace pzstd;
16
TEST(ResourcePool,FullTest)17 TEST(ResourcePool, FullTest) {
18 unsigned numCreated = 0;
19 unsigned numDeleted = 0;
20 {
21 ResourcePool<int> pool(
22 [&numCreated] { ++numCreated; return new int{5}; },
23 [&numDeleted](int *x) { ++numDeleted; delete x; });
24
25 {
26 auto i = pool.get();
27 EXPECT_EQ(5, *i);
28 *i = 6;
29 }
30 {
31 auto i = pool.get();
32 EXPECT_EQ(6, *i);
33 auto j = pool.get();
34 EXPECT_EQ(5, *j);
35 *j = 7;
36 }
37 {
38 auto i = pool.get();
39 EXPECT_EQ(6, *i);
40 auto j = pool.get();
41 EXPECT_EQ(7, *j);
42 }
43 }
44 EXPECT_EQ(2, numCreated);
45 EXPECT_EQ(numCreated, numDeleted);
46 }
47
TEST(ResourcePool,ThreadSafe)48 TEST(ResourcePool, ThreadSafe) {
49 std::atomic<unsigned> numCreated{0};
50 std::atomic<unsigned> numDeleted{0};
51 {
52 ResourcePool<int> pool(
53 [&numCreated] { ++numCreated; return new int{0}; },
54 [&numDeleted](int *x) { ++numDeleted; delete x; });
55 auto push = [&pool] {
56 for (int i = 0; i < 100; ++i) {
57 auto x = pool.get();
58 ++*x;
59 }
60 };
61 std::thread t1{push};
62 std::thread t2{push};
63 t1.join();
64 t2.join();
65
66 auto x = pool.get();
67 auto y = pool.get();
68 EXPECT_EQ(200, *x + *y);
69 }
70 EXPECT_GE(2, numCreated);
71 EXPECT_EQ(numCreated, numDeleted);
72 }
73