otsdaq-mu2e-stm  5.02.01
buffer_pool.cc
1 // Buffer pool header
2 #include "buffer_pool.hh"
3 
4 // Constructor
5 BufferPool::BufferPool(size_t pool_size, size_t buffer_size)
6 {
7  // Create specified number of buffers
8  for(size_t i = 0; i < pool_size; ++i)
9  {
10  // Add buffers to pool
11  pool.emplace_back(std::make_shared<DataStruct>(buffer_size));
12  }
13 }
14 
15 // Acquire a buffer from the pool
16 std::shared_ptr<DataStruct> BufferPool::acquire()
17 {
18  // Lock for thread safety
19  std::lock_guard<std::mutex> lock(mutex);
20 
21  // If pool is empty
22  if(pool.empty())
23  {
24  // Return nullptr to signal no available buffer
25  return nullptr;
26  }
27  else
28  {
29  // Retrieve buffer from the pool
30  auto buffer = pool.back();
31  // Remove buffer from pool
32  pool.pop_back();
33  // Return the buffer
34  return buffer;
35  }
36 }
37 
38 // Return a buffer to the pool
39 void BufferPool::release(std::shared_ptr<DataStruct> buffer)
40 {
41  // Lock for thread safety
42  std::lock_guard<std::mutex> lock(mutex);
43  // Add buffer back to pool
44  pool.push_back(buffer);
45 }