Apollo 10.0
自动驾驶开放平台
apollo::cyber::base::CCObjectPool< T > 模板类 参考

#include <concurrent_object_pool.h>

类 apollo::cyber::base::CCObjectPool< T > 继承关系图:
apollo::cyber::base::CCObjectPool< T > 的协作图:

Public 成员函数

 CCObjectPool (uint32_t size)
 
virtual ~CCObjectPool ()
 
template<typename... Args>
void ConstructAll (Args &&... args)
 
template<typename... Args>
std::shared_ptr< T > ConstructObject (Args &&... args)
 
std::shared_ptr< T > GetObject ()
 
void ReleaseObject (T *)
 
uint32_t size () const
 

详细描述

template<typename T>
class apollo::cyber::base::CCObjectPool< T >

在文件 concurrent_object_pool.h36 行定义.

构造及析构函数说明

◆ CCObjectPool()

template<typename T >
apollo::cyber::base::CCObjectPool< T >::CCObjectPool ( uint32_t  size)
explicit

在文件 concurrent_object_pool.h73 行定义.

73 : capacity_(size) {
74 node_arena_ = static_cast<Node *>(CheckedCalloc(capacity_, sizeof(Node)));
75 FOR_EACH(i, 0, capacity_ - 1) { node_arena_[i].next = node_arena_ + 1 + i; }
76 node_arena_[capacity_ - 1].next = nullptr;
77 free_head_.store({0, node_arena_}, std::memory_order_relaxed);
78}
Definition node.h:31
void * CheckedCalloc(size_t num, size_t size)
Definition macros.h:69
#define FOR_EACH(i, begin, end)
Definition for_each.h:44

◆ ~CCObjectPool()

template<typename T >
apollo::cyber::base::CCObjectPool< T >::~CCObjectPool ( )
virtual

在文件 concurrent_object_pool.h89 行定义.

89 {
90 std::free(node_arena_);
91}

成员函数说明

◆ ConstructAll()

template<typename T >
template<typename... Args>
void apollo::cyber::base::CCObjectPool< T >::ConstructAll ( Args &&...  args)

在文件 concurrent_object_pool.h82 行定义.

82 {
83 FOR_EACH(i, 0, capacity_) {
84 new (node_arena_ + i) T(std::forward<Args>(args)...);
85 }
86}

◆ ConstructObject()

template<typename T >
template<typename... Args>
std::shared_ptr< T > apollo::cyber::base::CCObjectPool< T >::ConstructObject ( Args &&...  args)

在文件 concurrent_object_pool.h123 行定义.

123 {
124 Head free_head;
125 if (cyber_unlikely(!FindFreeHead(&free_head))) {
126 return nullptr;
127 }
128 auto self = this->shared_from_this();
129 T *ptr = new (free_head.node) T(std::forward<Args>(args)...);
130 return std::shared_ptr<T>(ptr, [self](T *object) {
131 object->~T();
132 self->ReleaseObject(object);
133 });
134}
#define cyber_unlikely(x)
Definition macros.h:30

◆ GetObject()

template<typename T >
std::shared_ptr< T > apollo::cyber::base::CCObjectPool< T >::GetObject ( )

在文件 concurrent_object_pool.h111 行定义.

111 {
112 Head free_head;
113 if (cyber_unlikely(!FindFreeHead(&free_head))) {
114 return nullptr;
115 }
116 auto self = this->shared_from_this();
117 return std::shared_ptr<T>(reinterpret_cast<T *>(free_head.node),
118 [self](T *object) { self->ReleaseObject(object); });
119}

◆ ReleaseObject()

template<typename T >
void apollo::cyber::base::CCObjectPool< T >::ReleaseObject ( T *  object)

在文件 concurrent_object_pool.h137 行定义.

137 {
138 Head new_head;
139 Node *node = reinterpret_cast<Node *>(object);
140 Head old_head = free_head_.load(std::memory_order_acquire);
141 do {
142 node->next = old_head.node;
143 new_head.node = node;
144 new_head.count = old_head.count + 1;
145 } while (!free_head_.compare_exchange_weak(old_head, new_head,
146 std::memory_order_acq_rel,
147 std::memory_order_acquire));
148}

◆ size()

template<typename T >
uint32_t apollo::cyber::base::CCObjectPool< T >::size ( ) const

该类的文档由以下文件生成: