27 #define PERCEPTION_BASE_DISABLE_POOL 29 namespace perception {
32 static const size_t kPoolDefaultExtendNum = 10;
33 static const size_t kPoolDefaultSize = 100;
41 template <
class ObjectType,
size_t N = kPoolDefaultSize,
53 std::shared_ptr<ObjectType>
Get()
override {
55 #ifndef PERCEPTION_BASE_DISABLE_POOL 58 std::lock_guard<std::mutex> lock(mutex_);
60 Add(1 + kPoolDefaultExtendNum);
68 return std::shared_ptr<ObjectType>(ptr, [&](
ObjectType* obj_ptr) {
69 std::lock_guard<std::mutex> lock(mutex_);
73 return std::shared_ptr<ObjectType>(
new ObjectType);
80 std::vector<std::shared_ptr<ObjectType>>* data)
override {
81 #ifndef PERCEPTION_BASE_DISABLE_POOL 82 std::vector<ObjectType*> buffer(num,
nullptr);
84 std::lock_guard<std::mutex> lock(mutex_);
85 if (queue_.size() < num) {
86 Add(num - queue_.size() + kPoolDefaultExtendNum);
88 for (
size_t i = 0; i < num; ++i) {
89 buffer[i] = queue_.front();
95 for (
size_t i = 0; i < num; ++i) {
96 kInitializer(buffer[i]);
98 std::shared_ptr<ObjectType>(buffer[i], [&](
ObjectType* obj_ptr) {
99 std::lock_guard<std::mutex> lock(mutex_);
100 queue_.push(obj_ptr);
104 for (
size_t i = 0; i < num; ++i) {
114 std::list<std::shared_ptr<ObjectType>>* data)
override {
115 #ifndef PERCEPTION_BASE_DISABLE_POOL 116 std::vector<ObjectType*> buffer(num,
nullptr);
118 std::lock_guard<std::mutex> lock(mutex_);
119 if (queue_.size() < num) {
120 Add(num - queue_.size() + kPoolDefaultExtendNum);
122 for (
size_t i = 0; i < num; ++i) {
123 buffer[i] = queue_.front();
129 for (
size_t i = 0; i < num; ++i) {
130 kInitializer(buffer[i]);
131 is_front ? data->emplace_front(std::shared_ptr<ObjectType>(
134 std::lock_guard<std::mutex> lock(mutex_);
135 queue_.push(obj_ptr);
137 : data->emplace_back(std::shared_ptr<ObjectType>(
139 std::lock_guard<std::mutex> lock(mutex_);
140 queue_.push(obj_ptr);
144 for (
size_t i = 0; i < num; ++i) {
145 is_front ? data->emplace_front(
new ObjectType)
155 std::deque<std::shared_ptr<ObjectType>>* data)
override {
156 #ifndef PERCEPTION_BASE_DISABLE_POOL 157 std::vector<ObjectType*> buffer(num,
nullptr);
159 std::lock_guard<std::mutex> lock(mutex_);
160 if (queue_.size() < num) {
161 Add(num - queue_.size() + kPoolDefaultExtendNum);
163 for (
size_t i = 0; i < num; ++i) {
164 buffer[i] = queue_.front();
168 for (
size_t i = 0; i < num; ++i) {
169 kInitializer(buffer[i]);
170 is_front ? data->emplace_front(std::shared_ptr<ObjectType>(
173 std::lock_guard<std::mutex> lock(mutex_);
174 queue_.push(obj_ptr);
176 : data->emplace_back(std::shared_ptr<ObjectType>(
178 std::lock_guard<std::mutex> lock(mutex_);
179 queue_.push(obj_ptr);
183 for (
size_t i = 0; i < num; ++i) {
184 is_front ? data->emplace_front(
new ObjectType)
189 #ifndef PERCEPTION_BASE_DISABLE_POOL 191 void set_capacity(
size_t capacity)
override {
192 std::lock_guard<std::mutex> lock(mutex_);
193 if (capacity_ < capacity) {
194 Add(capacity - capacity_);
198 size_t RemainedNum()
override {
return queue_.size(); }
206 for (
auto& ptr : extended_cache_) {
209 extended_cache_.clear();
214 #ifndef PERCEPTION_BASE_DISABLE_POOL 215 void Add(
size_t num) {
216 for (
size_t i = 0; i < num; ++i) {
218 extended_cache_.push_back(ptr);
221 capacity_ = kDefaultCacheSize + extended_cache_.size();
226 : kDefaultCacheSize(default_size) {
227 #ifndef PERCEPTION_BASE_DISABLE_POOL 229 for (
size_t i = 0; i < kDefaultCacheSize; ++i) {
230 queue_.push(&cache_[i]);
232 capacity_ = kDefaultCacheSize;
~ConcurrentObjectPool() override
Definition: concurrent_object_pool.h:201
PlanningContext is the runtime context in planning. It is persistent across multiple frames...
Definition: atomic_hash_map.h:25
ConcurrentObjectPool(const size_t default_size)
Definition: concurrent_object_pool.h:225
Definition: concurrent_object_pool.h:37
static ConcurrentObjectPool & Instance()
Definition: concurrent_object_pool.h:48
void BatchGet(size_t num, bool is_front, std::deque< std::shared_ptr< ObjectType >> *data) override
Definition: concurrent_object_pool.h:154
static const Initializer kInitializer
Definition: concurrent_object_pool.h:242
std::queue< ObjectType * > queue_
Definition: concurrent_object_pool.h:236
std::mutex mutex_
Definition: concurrent_object_pool.h:235
const size_t kDefaultCacheSize
Definition: concurrent_object_pool.h:239
Definition: concurrent_object_pool.h:43
void BatchGet(size_t num, bool is_front, std::list< std::shared_ptr< ObjectType >> *data) override
Definition: concurrent_object_pool.h:113
Definition: object_pool.h:28
std::list< ObjectType * > extended_cache_
Definition: concurrent_object_pool.h:241
void operator()(T *t) const
Definition: concurrent_object_pool.h:38
std::shared_ptr< ObjectType > Get() override
Definition: concurrent_object_pool.h:53
ObjectType
Definition: object_types.h:26
void BatchGet(size_t num, std::vector< std::shared_ptr< ObjectType >> *data) override
Definition: concurrent_object_pool.h:79