blob: 548edec0f42bcbafdef88dd2162f1cd5c5237941 [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
Jim Flynne195a042022-04-12 17:19:28 +010011#if !defined(ARMNN_DISABLE_THREADS)
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010012#include <mutex>
Jim Flynne195a042022-04-12 17:19:28 +010013#endif
14
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010015#include <vector>
Finn Williamsb6a402f2020-03-24 13:46:22 +000016#include <queue>
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010017
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000018namespace arm
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010019{
20
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000021namespace pipe
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010022{
23
24class BufferManager : public IBufferManager
25{
26public:
27 BufferManager(unsigned int numberOfBuffers = 5, unsigned int maxPacketSize = 4096);
28
29 ~BufferManager() {}
30
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000031 IPacketBufferPtr Reserve(unsigned int requestedSize, unsigned int& reservedSize) override;
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010032
Finn Williams09ad6f92019-12-19 17:05:18 +000033 void Reset();
34
Sadik Armagan3896b472020-02-10 12:24:15 +000035 void Commit(IPacketBufferPtr& packetBuffer, unsigned int size, bool notifyConsumer = true) override;
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010036
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000037 void Release(IPacketBufferPtr& packetBuffer) override;
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010038
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000039 IPacketBufferPtr GetReadableBuffer() override;
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010040
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000041 void MarkRead(IPacketBufferPtr& packetBuffer) override;
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010042
Sadik Armagan3896b472020-02-10 12:24:15 +000043 /// Set Consumer on the buffer manager to be notified when there is a Commit
44 /// Can only be one consumer
45 void SetConsumer(IConsumer* consumer) override;
46
47 /// Notify the Consumer buffer can be read
48 void FlushReadList() override;
49
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010050private:
Finn Williams09ad6f92019-12-19 17:05:18 +000051 void Initialize();
52
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010053 // Maximum buffer size
54 unsigned int m_MaxBufferSize;
Finn Williams09ad6f92019-12-19 17:05:18 +000055 // Number of buffers
Jim Flynn0204f092020-06-22 20:41:43 +010056 const unsigned int m_NumberOfBuffers;
57 const unsigned int m_MaxNumberOfBuffers;
58 unsigned int m_CurrentNumberOfBuffers;
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010059
60 // List of available packet buffers
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000061 std::vector<IPacketBufferPtr> m_AvailableList;
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010062
63 // List of readable packet buffers
Finn Williamsb6a402f2020-03-24 13:46:22 +000064 std::queue<IPacketBufferPtr> m_ReadableList;
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010065
Jim Flynne195a042022-04-12 17:19:28 +010066#if !defined(ARMNN_DISABLE_THREADS)
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010067 // Mutex for available packet buffer list
68 std::mutex m_AvailableMutex;
69
70 // Mutex for readable packet buffer list
71 std::mutex m_ReadableMutex;
Jim Flynne195a042022-04-12 17:19:28 +010072#endif
Sadik Armagan3896b472020-02-10 12:24:15 +000073
74 // Consumer thread to notify packet is ready to read
75 IConsumer* m_Consumer = nullptr;
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010076};
77
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000078} // namespace pipe
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010079
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000080} // namespace arm