glean/rts/ownership/pool.h (54 lines of code) (raw):
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
* 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.
*/
#pragma once
#include <vector>
namespace facebook {
namespace glean {
namespace rts {
template<typename T>
struct Pool {
static_assert(std::is_trivially_destructible_v<T>, "invalid T");
std::vector<char *> pages;
size_t page_size;
size_t filled;
Pool() noexcept {
page_size = folly::goodMallocSize(1000000)/sizeof(T);
filled = page_size;
}
~Pool() noexcept {
clear();
}
Pool(const Pool&) = delete;
Pool(Pool&&) noexcept = default;
Pool& operator=(const Pool&) = delete;
Pool& operator=(Pool&&) noexcept = default;
void swap(Pool& other) {
pages.swap(other.pages);
std::swap(page_size, other.page_size);
std::swap(filled, other.filled);
}
void clear() {
for (auto p : pages) {
free(p);
}
pages.clear();
filled = page_size;
}
void *next() {
if (filled == page_size) {
pages.push_back(static_cast<char *>(malloc(sizeof(T) * page_size)));
filled = 0;
}
const auto p = pages.back() + filled * sizeof(T);
++filled;
return p;
}
template<typename... Args>
T *alloc(Args&&... args) {
return new (next()) T(std::forward<Args>(args)...);
}
size_t count() const {
return pages.size() * page_size + filled - page_size;
}
};
}
}
}