blob: d678cd3ec06107f0330505c41473bf78bd01d16c [file] [log] [blame]
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +01001//
2// Copyright © 2019 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#pragma once
7
8#include "IBufferManager.hpp"
Sadik Armagan3896b472020-02-10 12:24:15 +00009#include "IConsumer.hpp"
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010010
11#include <condition_variable>
12#include <mutex>
13#include <vector>
14
15namespace armnn
16{
17
18namespace profiling
19{
20
21class BufferManager : public IBufferManager
22{
23public:
24 BufferManager(unsigned int numberOfBuffers = 5, unsigned int maxPacketSize = 4096);
25
26 ~BufferManager() {}
27
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000028 IPacketBufferPtr Reserve(unsigned int requestedSize, unsigned int& reservedSize) override;
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010029
Finn Williams09ad6f92019-12-19 17:05:18 +000030 void Reset();
31
Sadik Armagan3896b472020-02-10 12:24:15 +000032 void Commit(IPacketBufferPtr& packetBuffer, unsigned int size, bool notifyConsumer = true) override;
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010033
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000034 void Release(IPacketBufferPtr& packetBuffer) override;
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010035
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000036 IPacketBufferPtr GetReadableBuffer() override;
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010037
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000038 void MarkRead(IPacketBufferPtr& packetBuffer) override;
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010039
Sadik Armagan3896b472020-02-10 12:24:15 +000040 /// Set Consumer on the buffer manager to be notified when there is a Commit
41 /// Can only be one consumer
42 void SetConsumer(IConsumer* consumer) override;
43
44 /// Notify the Consumer buffer can be read
45 void FlushReadList() override;
46
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010047private:
Finn Williams09ad6f92019-12-19 17:05:18 +000048 void Initialize();
49
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010050 // Maximum buffer size
51 unsigned int m_MaxBufferSize;
Finn Williams09ad6f92019-12-19 17:05:18 +000052 // Number of buffers
53 unsigned int m_NumberOfBuffers;
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010054
55 // List of available packet buffers
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000056 std::vector<IPacketBufferPtr> m_AvailableList;
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010057
58 // List of readable packet buffers
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000059 std::vector<IPacketBufferPtr> m_ReadableList;
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010060
61 // Mutex for available packet buffer list
62 std::mutex m_AvailableMutex;
63
64 // Mutex for readable packet buffer list
65 std::mutex m_ReadableMutex;
Sadik Armagan3896b472020-02-10 12:24:15 +000066
67 // Consumer thread to notify packet is ready to read
68 IConsumer* m_Consumer = nullptr;
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010069};
70
71} // namespace profiling
72
73} // namespace armnn