ArmNN
 20.05
BufferManager Class Reference

#include <BufferManager.hpp>

Inheritance diagram for BufferManager:
IBufferManager

Public Member Functions

 BufferManager (unsigned int numberOfBuffers=5, unsigned int maxPacketSize=4096)
 
 ~BufferManager ()
 
IPacketBufferPtr Reserve (unsigned int requestedSize, unsigned int &reservedSize) override
 
void Reset ()
 
void Commit (IPacketBufferPtr &packetBuffer, unsigned int size, bool notifyConsumer=true) override
 
void Release (IPacketBufferPtr &packetBuffer) override
 
IPacketBufferPtr GetReadableBuffer () override
 
void MarkRead (IPacketBufferPtr &packetBuffer) override
 
void SetConsumer (IConsumer *consumer) override
 Set Consumer on the buffer manager to be notified when there is a Commit Can only be one consumer. More...
 
void FlushReadList () override
 Notify the Consumer buffer can be read. More...
 
- Public Member Functions inherited from IBufferManager
virtual ~IBufferManager ()
 

Detailed Description

Definition at line 22 of file BufferManager.hpp.

Constructor & Destructor Documentation

◆ BufferManager()

BufferManager ( unsigned int  numberOfBuffers = 5,
unsigned int  maxPacketSize = 4096 
)

Definition at line 15 of file BufferManager.cpp.

16  : m_MaxBufferSize(maxPacketSize),
17  m_NumberOfBuffers(numberOfBuffers)
18 {
19  Initialize();
20 }

◆ ~BufferManager()

Member Function Documentation

◆ Commit()

void Commit ( IPacketBufferPtr packetBuffer,
unsigned int  size,
bool  notifyConsumer = true 
)
overridevirtual

Implements IBufferManager.

Definition at line 43 of file BufferManager.cpp.

References BufferManager::FlushReadList().

Referenced by BOOST_AUTO_TEST_CASE(), and BufferManager::~BufferManager().

44 {
45  std::unique_lock<std::mutex> readableListLock(m_ReadableMutex, std::defer_lock);
46  packetBuffer->Commit(size);
47  readableListLock.lock();
48  m_ReadableList.push(std::move(packetBuffer));
49  readableListLock.unlock();
50 
51  if (notifyConsumer)
52  {
53  FlushReadList();
54  }
55 }
void FlushReadList() override
Notify the Consumer buffer can be read.

◆ FlushReadList()

void FlushReadList ( )
overridevirtual

Notify the Consumer buffer can be read.

Implements IBufferManager.

Definition at line 115 of file BufferManager.cpp.

References IConsumer::SetReadyToRead().

Referenced by BufferManager::Commit(), and BufferManager::~BufferManager().

116 {
117  // notify consumer that packet is ready to read
118  if (m_Consumer != nullptr)
119  {
120  m_Consumer->SetReadyToRead();
121  }
122 }
virtual void SetReadyToRead()=0
Set a "ready to read" flag in the buffer to notify the reading thread to start reading it...

◆ GetReadableBuffer()

IPacketBufferPtr GetReadableBuffer ( )
overridevirtual

Implements IBufferManager.

Definition at line 88 of file BufferManager.cpp.

Referenced by BOOST_AUTO_TEST_CASE(), CheckTimelineDirectory(), VerifyPostOptimisationStructureTestImpl(), and BufferManager::~BufferManager().

89 {
90  std::unique_lock<std::mutex> readableListLock(m_ReadableMutex);
91  if (!m_ReadableList.empty())
92  {
93  IPacketBufferPtr buffer = std::move(m_ReadableList.front());
94  m_ReadableList.pop();
95  readableListLock.unlock();
96  return buffer;
97  }
98  return nullptr;
99 }
std::unique_ptr< IPacketBuffer > IPacketBufferPtr

◆ MarkRead()

void MarkRead ( IPacketBufferPtr packetBuffer)
overridevirtual

Implements IBufferManager.

Definition at line 101 of file BufferManager.cpp.

Referenced by BOOST_AUTO_TEST_CASE(), and BufferManager::~BufferManager().

102 {
103  std::unique_lock<std::mutex> availableListLock(m_AvailableMutex, std::defer_lock);
104  packetBuffer->MarkRead();
105  availableListLock.lock();
106  m_AvailableList.push_back(std::move(packetBuffer));
107  availableListLock.unlock();
108 }

◆ Release()

void Release ( IPacketBufferPtr packetBuffer)
overridevirtual

Implements IBufferManager.

Definition at line 67 of file BufferManager.cpp.

Referenced by BOOST_AUTO_TEST_CASE(), and BufferManager::~BufferManager().

68 {
69  std::unique_lock<std::mutex> availableListLock(m_AvailableMutex, std::defer_lock);
70  packetBuffer->Release();
71  availableListLock.lock();
72  m_AvailableList.push_back(std::move(packetBuffer));
73  availableListLock.unlock();
74 }

◆ Reserve()

IPacketBufferPtr Reserve ( unsigned int  requestedSize,
unsigned int &  reservedSize 
)
overridevirtual

Implements IBufferManager.

Definition at line 22 of file BufferManager.cpp.

Referenced by BOOST_AUTO_TEST_CASE(), and BufferManager::~BufferManager().

23 {
24  reservedSize = 0;
25  std::unique_lock<std::mutex> availableListLock(m_AvailableMutex, std::defer_lock);
26  if (requestedSize > m_MaxBufferSize)
27  {
28  return nullptr;
29  }
30  availableListLock.lock();
31  if (m_AvailableList.empty())
32  {
33  availableListLock.unlock();
34  return nullptr;
35  }
36  IPacketBufferPtr buffer = std::move(m_AvailableList.back());
37  m_AvailableList.pop_back();
38  availableListLock.unlock();
39  reservedSize = requestedSize;
40  return buffer;
41 }
std::unique_ptr< IPacketBuffer > IPacketBufferPtr

◆ Reset()

void Reset ( )

Definition at line 76 of file BufferManager.cpp.

References armnn::swap().

Referenced by ProfilingService::GetSendTimelinePacket(), and BufferManager::~BufferManager().

77 {
78  //This method should only be called once all threads have been joined
79  std::lock_guard<std::mutex> readableListLock(m_ReadableMutex);
80  std::lock_guard<std::mutex> availableListLock(m_AvailableMutex);
81 
82  m_AvailableList.clear();
83  std::queue<IPacketBufferPtr>().swap(m_ReadableList);
84 
85  Initialize();
86 }
void swap(OriginsDescriptor &first, OriginsDescriptor &second)

◆ SetConsumer()

void SetConsumer ( IConsumer consumer)
overridevirtual

Set Consumer on the buffer manager to be notified when there is a Commit Can only be one consumer.

Implements IBufferManager.

Definition at line 110 of file BufferManager.cpp.

Referenced by BufferManager::~BufferManager().

111 {
112  m_Consumer = consumer;
113 }

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