From f9aeef0e036df176699aa96d30d2ca8d7546534e Mon Sep 17 00:00:00 2001 From: Aron Virginas-Tar Date: Fri, 12 Oct 2018 15:18:03 +0100 Subject: IVGCVSW-2006: Move ACL memory manager source code under aclCommon Change-Id: Ie1c74a18de5c3dd1cd5285c222bd6327489c1508 --- src/backends/aclCommon/memory/PoolManager.cpp | 105 ++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 src/backends/aclCommon/memory/PoolManager.cpp (limited to 'src/backends/aclCommon/memory/PoolManager.cpp') diff --git a/src/backends/aclCommon/memory/PoolManager.cpp b/src/backends/aclCommon/memory/PoolManager.cpp new file mode 100644 index 0000000000..363b4590b3 --- /dev/null +++ b/src/backends/aclCommon/memory/PoolManager.cpp @@ -0,0 +1,105 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// +#include "IMemoryPool.hpp" +#include "PoolManager.hpp" + +#include +#include + +#include + +namespace armnn +{ + +PoolManager::PoolManager() + : m_FreePools() + , m_OccupiedPools() + , m_Semaphore() + , m_Mutex() +{} + +arm_compute::IMemoryPool *PoolManager::lock_pool() +{ + BOOST_ASSERT_MSG(!(m_FreePools.empty() && m_OccupiedPools.empty()), "Haven't setup any pools"); + + m_Semaphore->wait(); + std::lock_guard lock(m_Mutex); + + BOOST_ASSERT_MSG(!m_FreePools.empty(), "Empty pool must exist as semaphore has been signalled"); + m_OccupiedPools.splice(std::begin(m_OccupiedPools), m_FreePools, std::begin(m_FreePools)); + + return m_OccupiedPools.front().get(); +} + +void PoolManager::unlock_pool(arm_compute::IMemoryPool *pool) +{ + BOOST_ASSERT_MSG(!(m_FreePools.empty() && m_OccupiedPools.empty()), "Haven't setup any pools!"); + + std::lock_guard lock(m_Mutex); + + auto it = std::find_if( + std::begin(m_OccupiedPools), + std::end(m_OccupiedPools), + [pool](const std::unique_ptr &poolIterator) + { + return poolIterator.get() == pool; + } + ); + + BOOST_ASSERT_MSG(it != std::end(m_OccupiedPools), "Pool to be unlocked couldn't be found"); + m_FreePools.splice(std::begin(m_FreePools), m_OccupiedPools, it); + m_Semaphore->signal(); +} + +void PoolManager::register_pool(std::unique_ptr pool) +{ + std::lock_guard lock(m_Mutex); + BOOST_ASSERT_MSG(m_OccupiedPools.empty(), "All pools should be free in order to register a new one"); + + // Set pool + m_FreePools.push_front(std::move(pool)); + + // Update semaphore + m_Semaphore = std::make_unique(m_FreePools.size()); +} + +size_t PoolManager::num_pools() const +{ + std::lock_guard lock(m_Mutex); + + return m_FreePools.size() + m_OccupiedPools.size(); +} + +void PoolManager::AllocatePools() +{ + std::lock_guard lock(m_Mutex); + + for (auto& pool : m_FreePools) + { + boost::polymorphic_downcast(pool.get())->AllocatePool(); + } + + for (auto& pool : m_OccupiedPools) + { + boost::polymorphic_downcast(pool.get())->AllocatePool(); + } +} + +void PoolManager::ReleasePools() +{ + std::lock_guard lock(m_Mutex); + + for (auto& pool : m_FreePools) + { + boost::polymorphic_downcast(pool.get())->ReleasePool(); + } + + for (auto& pool : m_OccupiedPools) + { + boost::polymorphic_downcast(pool.get())->ReleasePool(); + } +} + +} //namespace armnn \ No newline at end of file -- cgit v1.2.1