/* * 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/ResourcePool.h" #include #include #include using namespace pzstd; TEST(ResourcePool, FullTest) { unsigned numCreated = 0; unsigned numDeleted = 0; { ResourcePool pool( [&numCreated] { ++numCreated; return new int{5}; }, [&numDeleted](int *x) { ++numDeleted; delete x; }); { auto i = pool.get(); EXPECT_EQ(5, *i); *i = 6; } { auto i = pool.get(); EXPECT_EQ(6, *i); auto j = pool.get(); EXPECT_EQ(5, *j); *j = 7; } { auto i = pool.get(); EXPECT_EQ(6, *i); auto j = pool.get(); EXPECT_EQ(7, *j); } } EXPECT_EQ(2, numCreated); EXPECT_EQ(numCreated, numDeleted); } TEST(ResourcePool, ThreadSafe) { std::atomic numCreated{0}; std::atomic numDeleted{0}; { ResourcePool pool( [&numCreated] { ++numCreated; return new int{0}; }, [&numDeleted](int *x) { ++numDeleted; delete x; }); auto push = [&pool] { for (int i = 0; i < 100; ++i) { auto x = pool.get(); ++*x; } }; std::thread t1{push}; std::thread t2{push}; t1.join(); t2.join(); auto x = pool.get(); auto y = pool.get(); EXPECT_EQ(200, *x + *y); } EXPECT_GE(2, numCreated); EXPECT_EQ(numCreated, numDeleted); }