From 5a7989d5524db593026e733b406c3bde1c6b2ef9 Mon Sep 17 00:00:00 2001 From: Daniel Krebs Date: Tue, 30 Jan 2018 19:15:44 +0100 Subject: [PATCH] lib/memory-manager: start implementation using DirectedGraph --- fpga/include/villas/memory_manager.hpp | 77 +++++++++++++++++++++----- fpga/lib/memory_manager.cpp | 38 +++++++++++++ 2 files changed, 102 insertions(+), 13 deletions(-) diff --git a/fpga/include/villas/memory_manager.hpp b/fpga/include/villas/memory_manager.hpp index a992f84a0..935f262b3 100644 --- a/fpga/include/villas/memory_manager.hpp +++ b/fpga/include/villas/memory_manager.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include #include "log.hpp" #include "directed_graph.hpp" @@ -9,12 +10,25 @@ namespace villas { class Mapping : public graph::Edge { -public: - // create mapping here (if needed) - Mapping() {} + friend class MemoryManager; - // destroy mapping here (if needed) - ~Mapping() {} +public: + // create mapping here (if needed) + Mapping() {} + + // destroy mapping here (if needed) + virtual ~Mapping(); + + friend std::ostream& + operator<< (std::ostream& stream, const Mapping& mapping) + { + return stream << static_cast(mapping) << " = " + << std::hex + << "(src=0x" << mapping.src + << ", dest=0x" << mapping.dest + << ", size=0x" << mapping.size + << ")"; + } private: uintptr_t src; @@ -23,25 +37,62 @@ private: }; class AddressSpace : public graph::Vertex { + friend class MemoryManager; + +public: + friend std::ostream& + operator<< (std::ostream& stream, const AddressSpace& addrSpace) + { + return stream << static_cast(addrSpace) << " = " + << addrSpace.name; + } + private: - // do we need any metadata? maybe a name? - int id; + std::string name; }; // is or has a graph class MemoryManager { - -// This is a singleton private: - MemoryManager() = default; - static MemoryManager* instance; + // This is a singleton, so private constructor + MemoryManager() : + memoryGraph("MemoryGraph") {} + + // no copying or assigning + MemoryManager(const MemoryManager&) = delete; + MemoryManager& operator=(const MemoryManager&) = delete ; + + using MemoryGraph = graph::DirectedGraph; + public: - static MemoryManager& get(); + using AddressSpaceId = MemoryGraph::VertexIdentifier; + using MappingId = MemoryGraph::EdgeIdentifier; + static MemoryManager& get(); + + + AddressSpaceId createAddressSpace(std::string name); + + /// Create a default mapping + MappingId createMapping(uintptr_t src, uintptr_t dest, size_t size, + AddressSpaceId fromAddrSpace, + AddressSpaceId toAddrSpace); + + /// Add a mapping + /// + /// Can be used to derive from Mapping in order to implement custom + /// constructor/destructor. + MappingId addMapping(std::shared_ptr mapping, + AddressSpaceId fromAddrSpace, + AddressSpaceId toAddrSpace); + + void dump() + { memoryGraph.dump(); } private: -// std::list<> + MemoryGraph memoryGraph; + static MemoryManager* instance; }; } // namespace villas diff --git a/fpga/lib/memory_manager.cpp b/fpga/lib/memory_manager.cpp index d00460219..59269fe04 100644 --- a/fpga/lib/memory_manager.cpp +++ b/fpga/lib/memory_manager.cpp @@ -1,3 +1,5 @@ +#include + #include "memory_manager.hpp" namespace villas { @@ -15,5 +17,41 @@ MemoryManager::get() return *instance; } +MemoryManager::AddressSpaceId +MemoryManager::createAddressSpace(std::string name) +{ + std::shared_ptr addrSpace(new AddressSpace); + addrSpace->name = name; + + return memoryGraph.addVertex(addrSpace); +} + +MemoryManager::MappingId +MemoryManager::createMapping(uintptr_t src, uintptr_t dest, size_t size, + MemoryManager::AddressSpaceId fromAddrSpace, + MemoryManager::AddressSpaceId toAddrSpace) +{ + std::shared_ptr mapping(new Mapping); + mapping->src = src; + mapping->dest = dest; + mapping->size = size; + + return addMapping(mapping, fromAddrSpace, toAddrSpace); +} + +MemoryManager::MappingId +MemoryManager::addMapping(std::shared_ptr mapping, + MemoryManager::AddressSpaceId fromAddrSpace, + MemoryManager::AddressSpaceId toAddrSpace) +{ + return memoryGraph.addEdge(mapping, fromAddrSpace, toAddrSpace); +} + + +Mapping::~Mapping() +{ + +} + } // namespace villas