| 22 | } |
| 23 | |
| 24 | IPacketBufferPtr BufferManager::Reserve(unsigned int requestedSize, unsigned int& reservedSize) |
| 25 | { |
| 26 | reservedSize = 0; |
| 27 | #if !defined(ARMNN_DISABLE_THREADS) |
| 28 | std::unique_lock<std::mutex> availableListLock(m_AvailableMutex, std::defer_lock); |
| 29 | #endif |
| 30 | if (requestedSize > m_MaxBufferSize) |
| 31 | { |
| 32 | return nullptr; |
| 33 | } |
| 34 | #if !defined(ARMNN_DISABLE_THREADS) |
| 35 | availableListLock.lock(); |
| 36 | #endif |
| 37 | if (m_AvailableList.empty()) |
| 38 | { |
| 39 | if (m_CurrentNumberOfBuffers < m_MaxNumberOfBuffers) |
| 40 | { |
| 41 | // create a temporary overflow/surge buffer and hand it back |
| 42 | m_CurrentNumberOfBuffers++; |
| 43 | #if !defined(ARMNN_DISABLE_THREADS) |
| 44 | availableListLock.unlock(); |
| 45 | #endif |
| 46 | IPacketBufferPtr buffer = std::make_unique<PacketBuffer>(m_MaxBufferSize); |
| 47 | reservedSize = requestedSize; |
| 48 | return buffer; |
| 49 | } |
| 50 | else |
| 51 | { |
| 52 | // we have totally busted the limit. call a halt to new memory allocations. |
| 53 | #if !defined(ARMNN_DISABLE_THREADS) |
| 54 | availableListLock.unlock(); |
| 55 | #endif |
| 56 | return nullptr; |
| 57 | } |
| 58 | } |
| 59 | IPacketBufferPtr buffer = std::move(m_AvailableList.back()); |
| 60 | m_AvailableList.pop_back(); |
| 61 | #if !defined(ARMNN_DISABLE_THREADS) |
| 62 | availableListLock.unlock(); |
| 63 | #endif |
| 64 | reservedSize = requestedSize; |
| 65 | return buffer; |
| 66 | } |
| 67 | |
| 68 | void BufferManager::Commit(IPacketBufferPtr& packetBuffer, unsigned int size, bool notifyConsumer) |
| 69 | { |
no test coverage detected