blob: 0ab3e0e534dcb3c10ae905b8a2da642d71df90b9 [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>
Finn Williamsb6a402f2020-03-24 13:46:22 +000014#include <queue>
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010015
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000016namespace arm
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010017{
18
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000019namespace pipe
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010020{
21
22class BufferManager : public IBufferManager
23{
24public:
25 BufferManager(unsigned int numberOfBuffers = 5, unsigned int maxPacketSize = 4096);
26
27 ~BufferManager() {}
28
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000029 IPacketBufferPtr Reserve(unsigned int requestedSize, unsigned int& reservedSize) override;
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010030
Finn Williams09ad6f92019-12-19 17:05:18 +000031 void Reset();
32
Sadik Armagan3896b472020-02-10 12:24:15 +000033 void Commit(IPacketBufferPtr& packetBuffer, unsigned int size, bool notifyConsumer = true) override;
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010034
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000035 void Release(IPacketBufferPtr& packetBuffer) override;
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010036
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000037 IPacketBufferPtr GetReadableBuffer() override;
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010038
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000039 void MarkRead(IPacketBufferPtr& packetBuffer) override;
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010040
Sadik Armagan3896b472020-02-10 12:24:15 +000041 /// 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
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010048private:
Finn Williams09ad6f92019-12-19 17:05:18 +000049 void Initialize();
50
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010051 // Maximum buffer size
52 unsigned int m_MaxBufferSize;
Finn Williams09ad6f92019-12-19 17:05:18 +000053 // Number of buffers
Jim Flynn0204f092020-06-22 20:41:43 +010054 const unsigned int m_NumberOfBuffers;
55 const unsigned int m_MaxNumberOfBuffers;
56 unsigned int m_CurrentNumberOfBuffers;
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010057
58 // List of available packet buffers
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000059 std::vector<IPacketBufferPtr> m_AvailableList;
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010060
61 // List of readable packet buffers
Finn Williamsb6a402f2020-03-24 13:46:22 +000062 std::queue<IPacketBufferPtr> m_ReadableList;
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010063
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;
Sadik Armagan3896b472020-02-10 12:24:15 +000069
70 // Consumer thread to notify packet is ready to read
71 IConsumer* m_Consumer = nullptr;
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010072};
73
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000074} // namespace pipe
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010075
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000076} // namespace arm