blob: 3f26b2554b30277cd6825cc9118faaf2cf9eb831 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#ifndef TVM_RUNTIME_HEXAGON_HEXAGON_BUFFER_MANAGER_H_
#define TVM_RUNTIME_HEXAGON_HEXAGON_BUFFER_MANAGER_H_
#include <tvm/runtime/logging.h>
#include <memory>
#include <unordered_map>
#include <utility>
#include <vector>
#include "hexagon_buffer.h"
namespace tvm {
namespace runtime {
namespace hexagon {
class HexagonBufferManager {
public:
~HexagonBufferManager() {
if (!hexagon_buffer_map_.empty()) {
DLOG(INFO) << "HexagonBufferManager is not empty upon destruction";
}
}
/*!
* \brief Free a HexagonBuffer.
* \param ptr Address of the HexagonBuffer as returned by `AllocateHexagonBuffer`.
*/
void FreeHexagonBuffer(void* ptr) {
std::lock_guard<std::mutex> lock(map_mutex_);
auto it = hexagon_buffer_map_.find(ptr);
TVM_FFI_ICHECK(it != hexagon_buffer_map_.end())
<< "Attempt made to free unknown or already freed allocation";
TVM_FFI_ICHECK(it->second != nullptr);
hexagon_buffer_map_.erase(it);
}
/*!
* \brief Allocate a HexagonBuffer.
* \param args Templated arguments to pass through to HexagonBuffer constructor.
*/
template <typename... Args>
void* AllocateHexagonBuffer(Args&&... args) {
auto buf = std::make_unique<HexagonBuffer>(std::forward<Args>(args)...);
void* ptr = buf->GetPointer();
{
std::lock_guard<std::mutex> lock(map_mutex_);
hexagon_buffer_map_.insert({ptr, std::move(buf)});
}
return ptr;
}
//! \brief Returns an iterator to the HexagonBuffer within the map.
HexagonBuffer* FindHexagonBuffer(void* ptr) {
std::lock_guard<std::mutex> lock(map_mutex_);
auto it = hexagon_buffer_map_.find(ptr);
if (it != hexagon_buffer_map_.end()) {
return it->second.get();
}
return nullptr;
}
private:
//! \brief Contains the HexagonBuffer objects managed by this class.
std::unordered_map<void*, std::unique_ptr<HexagonBuffer>> hexagon_buffer_map_;
//! \brief Protects updates to the map.
std::mutex map_mutex_;
};
} // namespace hexagon
} // namespace runtime
} // namespace tvm
#endif // TVM_RUNTIME_HEXAGON_HEXAGON_BUFFER_MANAGER_H_