• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright © 2019 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #pragma once
7 
8 #include "IBufferManager.hpp"
9 #include "IConsumer.hpp"
10 
11 #include <condition_variable>
12 #include <mutex>
13 #include <vector>
14 #include <queue>
15 
16 namespace armnn
17 {
18 
19 namespace profiling
20 {
21 
22 class BufferManager : public IBufferManager
23 {
24 public:
25     BufferManager(unsigned int numberOfBuffers = 5, unsigned int maxPacketSize = 4096);
26 
~BufferManager()27     ~BufferManager() {}
28 
29     IPacketBufferPtr Reserve(unsigned int requestedSize, unsigned int& reservedSize) override;
30 
31     void Reset();
32 
33     void Commit(IPacketBufferPtr& packetBuffer, unsigned int size, bool notifyConsumer = true) override;
34 
35     void Release(IPacketBufferPtr& packetBuffer) override;
36 
37     IPacketBufferPtr GetReadableBuffer() override;
38 
39     void MarkRead(IPacketBufferPtr& packetBuffer) override;
40 
41     /// Set Consumer on the buffer manager to be notified when there is a Commit
42     /// Can only be one consumer
43     void SetConsumer(IConsumer* consumer) override;
44 
45     /// Notify the Consumer buffer can be read
46     void FlushReadList() override;
47 
48 private:
49     void Initialize();
50 
51     // Maximum buffer size
52     unsigned int m_MaxBufferSize;
53     // Number of buffers
54     const unsigned int m_NumberOfBuffers;
55     const unsigned int m_MaxNumberOfBuffers;
56     unsigned int m_CurrentNumberOfBuffers;
57 
58     // List of available packet buffers
59     std::vector<IPacketBufferPtr> m_AvailableList;
60 
61     // List of readable packet buffers
62     std::queue<IPacketBufferPtr> m_ReadableList;
63 
64     // Mutex for available packet buffer list
65     std::mutex m_AvailableMutex;
66 
67     // Mutex for readable packet buffer list
68     std::mutex m_ReadableMutex;
69 
70     // Consumer thread to notify packet is ready to read
71     IConsumer* m_Consumer = nullptr;
72 };
73 
74 } // namespace profiling
75 
76 } // namespace armnn
77