Network System 0.1.1
High-performance modular networking library for scalable client-server applications
Loading...
Searching...
No Matches
kcenon::network::utils::buffer_pool::impl Class Reference
Collaboration diagram for kcenon::network::utils::buffer_pool::impl:
Collaboration graph

Public Member Functions

 impl (size_t pool_size, size_t default_capacity)
 
auto acquire (size_t min_capacity, buffer_pool *parent) -> std::shared_ptr< std::vector< uint8_t > >
 
auto release (std::vector< uint8_t > *buffer) -> void
 
auto get_stats () const -> std::pair< size_t, size_t >
 
auto clear () -> void
 

Private Attributes

size_t pool_size_
 
size_t default_capacity_
 
std::atomic< size_t > total_allocated_
 
std::mutex mutex_
 
std::deque< std::unique_ptr< std::vector< uint8_t > > > available_buffers_
 

Detailed Description

Definition at line 15 of file buffer_pool.cpp.

Constructor & Destructor Documentation

◆ impl()

kcenon::network::utils::buffer_pool::impl::impl ( size_t pool_size,
size_t default_capacity )
inlineexplicit

Definition at line 18 of file buffer_pool.cpp.

19 : pool_size_(pool_size), default_capacity_(default_capacity), total_allocated_(0)
20 {
21 NETWORK_LOG_DEBUG("[buffer_pool] Created with pool_size=" +
22 std::to_string(pool_size) +
23 ", default_capacity=" + std::to_string(default_capacity));
24 }
#define NETWORK_LOG_DEBUG(msg)

References NETWORK_LOG_DEBUG.

Member Function Documentation

◆ acquire()

auto kcenon::network::utils::buffer_pool::impl::acquire ( size_t min_capacity,
buffer_pool * parent ) -> std::shared_ptr<std::vector<uint8_t>>
inline

Definition at line 26 of file buffer_pool.cpp.

27 {
28 std::unique_lock<std::mutex> lock(mutex_);
29
30 // Try to find a suitable buffer in the pool
31 for (auto it = available_buffers_.begin(); it != available_buffers_.end(); ++it)
32 {
33 if ((*it)->capacity() >= min_capacity)
34 {
35 auto buffer = std::move(*it);
36 available_buffers_.erase(it);
37
38 // Clear the buffer but keep capacity
39 buffer->clear();
40
41 NETWORK_LOG_TRACE("[buffer_pool] Acquired buffer from pool, capacity=" +
42 std::to_string(buffer->capacity()));
43
44 // Return with custom deleter that returns buffer to pool
45 return std::shared_ptr<std::vector<uint8_t>>(
46 buffer.release(), [parent](std::vector<uint8_t>* buf) {
47 if (parent)
48 {
49 parent->release(buf);
50 }
51 else
52 {
53 delete buf;
54 }
55 });
56 }
57 }
58
59 // No suitable buffer found, create a new one
60 size_t capacity = std::max(min_capacity, default_capacity_);
61 auto buffer = std::make_unique<std::vector<uint8_t>>();
62 buffer->reserve(capacity);
63
64 total_allocated_.fetch_add(1);
65
66 NETWORK_LOG_TRACE("[buffer_pool] Created new buffer, capacity=" +
67 std::to_string(capacity) +
68 ", total_allocated=" + std::to_string(total_allocated_.load()));
69
70 // Return with custom deleter
71 return std::shared_ptr<std::vector<uint8_t>>(
72 buffer.release(), [parent](std::vector<uint8_t>* buf) {
73 if (parent)
74 {
75 parent->release(buf);
76 }
77 else
78 {
79 delete buf;
80 }
81 });
82 }
std::deque< std::unique_ptr< std::vector< uint8_t > > > available_buffers_
#define NETWORK_LOG_TRACE(msg)

References available_buffers_, default_capacity_, mutex_, NETWORK_LOG_TRACE, and total_allocated_.

◆ clear()

auto kcenon::network::utils::buffer_pool::impl::clear ( ) -> void
inline

Definition at line 113 of file buffer_pool.cpp.

114 {
115 std::unique_lock<std::mutex> lock(mutex_);
116
117 size_t cleared = available_buffers_.size();
118 available_buffers_.clear();
119
120 total_allocated_.fetch_sub(cleared);
121
122 NETWORK_LOG_INFO("[buffer_pool] Cleared " + std::to_string(cleared) + " buffers");
123 }
#define NETWORK_LOG_INFO(msg)

References available_buffers_, mutex_, NETWORK_LOG_INFO, and total_allocated_.

Referenced by kcenon::network::utils::buffer_pool::~buffer_pool().

Here is the caller graph for this function:

◆ get_stats()

auto kcenon::network::utils::buffer_pool::impl::get_stats ( ) const -> std::pair<size_t, size_t>
inline

Definition at line 107 of file buffer_pool.cpp.

108 {
109 std::lock_guard<std::mutex> lock(mutex_);
110 return {available_buffers_.size(), total_allocated_.load()};
111 }

References available_buffers_, mutex_, and total_allocated_.

Referenced by kcenon::network::utils::buffer_pool::get_stats().

Here is the caller graph for this function:

◆ release()

auto kcenon::network::utils::buffer_pool::impl::release ( std::vector< uint8_t > * buffer) -> void
inline

Definition at line 84 of file buffer_pool.cpp.

85 {
86 if (!buffer)
87 return;
88
89 std::unique_lock<std::mutex> lock(mutex_);
90
91 // If pool is full, just delete the buffer
92 if (available_buffers_.size() >= pool_size_)
93 {
94 NETWORK_LOG_TRACE("[buffer_pool] Pool full, deleting buffer");
95 delete buffer;
96 total_allocated_.fetch_sub(1);
97 return;
98 }
99
100 // Return buffer to pool
101 available_buffers_.emplace_back(buffer);
102
103 NETWORK_LOG_TRACE("[buffer_pool] Returned buffer to pool, available=" +
104 std::to_string(available_buffers_.size()));
105 }

References available_buffers_, mutex_, NETWORK_LOG_TRACE, pool_size_, and total_allocated_.

Member Data Documentation

◆ available_buffers_

std::deque<std::unique_ptr<std::vector<uint8_t> > > kcenon::network::utils::buffer_pool::impl::available_buffers_
private

Definition at line 131 of file buffer_pool.cpp.

Referenced by acquire(), clear(), get_stats(), and release().

◆ default_capacity_

size_t kcenon::network::utils::buffer_pool::impl::default_capacity_
private

Definition at line 127 of file buffer_pool.cpp.

Referenced by acquire().

◆ mutex_

std::mutex kcenon::network::utils::buffer_pool::impl::mutex_
mutableprivate

Definition at line 130 of file buffer_pool.cpp.

Referenced by acquire(), clear(), get_stats(), and release().

◆ pool_size_

size_t kcenon::network::utils::buffer_pool::impl::pool_size_
private

Definition at line 126 of file buffer_pool.cpp.

Referenced by release().

◆ total_allocated_

std::atomic<size_t> kcenon::network::utils::buffer_pool::impl::total_allocated_
private

Definition at line 128 of file buffer_pool.cpp.

Referenced by acquire(), clear(), get_stats(), and release().


The documentation for this class was generated from the following file: