1 /* 2 * Copyright (c) Meta Platforms, Inc. and affiliates. 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 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 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