| | |
| | |
| | |
| | |
| |
|
| | #ifndef POCKET_TTS_MEMORY_POOL_HPP |
| | #define POCKET_TTS_MEMORY_POOL_HPP |
| |
|
| | #include <atomic> |
| | #include <cstddef> |
| | #include <cstdint> |
| | #include <memory> |
| | #include <mutex> |
| | #include <unordered_map> |
| | #include <vector> |
| |
|
| | namespace pocket_tts_accelerator { |
| |
|
| | struct MemoryBlock { |
| | std::unique_ptr<std::uint8_t[]> data; |
| | std::size_t block_size; |
| | bool is_in_use; |
| | std::uint64_t last_access_timestamp; |
| | }; |
| |
|
| | class MemoryPool { |
| | public: |
| | explicit MemoryPool(std::size_t initial_pool_size_bytes = 64 * 1024 * 1024); |
| | ~MemoryPool(); |
| |
|
| | MemoryPool(const MemoryPool&) = delete; |
| | MemoryPool& operator=(const MemoryPool&) = delete; |
| | MemoryPool(MemoryPool&&) = delete; |
| | MemoryPool& operator=(MemoryPool&&) = delete; |
| |
|
| | std::uint8_t* allocate(std::size_t requested_size_bytes); |
| | void deallocate(std::uint8_t* pointer); |
| | void clear_unused_blocks(); |
| | void reset_pool(); |
| |
|
| | std::size_t get_total_allocated_bytes() const; |
| | std::size_t get_total_used_bytes() const; |
| | std::size_t get_block_count() const; |
| |
|
| | private: |
| | std::size_t find_suitable_block_index(std::size_t requested_size) const; |
| | void create_new_block(std::size_t block_size); |
| | std::uint64_t get_current_timestamp() const; |
| |
|
| | std::vector<MemoryBlock> memory_blocks; |
| | std::unordered_map<std::uint8_t*, std::size_t> pointer_to_block_index; |
| | mutable std::mutex pool_mutex; |
| | std::size_t total_allocated_bytes; |
| | std::size_t total_used_bytes; |
| | std::size_t maximum_pool_size_bytes; |
| | }; |
| |
|
| | class ScopedMemoryAllocation { |
| | public: |
| | ScopedMemoryAllocation(MemoryPool& pool, std::size_t size); |
| | ~ScopedMemoryAllocation(); |
| |
|
| | ScopedMemoryAllocation(const ScopedMemoryAllocation&) = delete; |
| | ScopedMemoryAllocation& operator=(const ScopedMemoryAllocation&) = delete; |
| | ScopedMemoryAllocation(ScopedMemoryAllocation&& other) noexcept; |
| | ScopedMemoryAllocation& operator=(ScopedMemoryAllocation&& other) noexcept; |
| |
|
| | std::uint8_t* get() const; |
| | std::size_t size() const; |
| |
|
| | private: |
| | MemoryPool* memory_pool_pointer; |
| | std::uint8_t* allocated_pointer; |
| | std::size_t allocation_size; |
| | }; |
| |
|
| | } |
| |
|
| | #endif |