#pragma once #include #include #include #include #include #include #include #include #include #include namespace wfr { namespace wfs { class AtomicActivityInstance; } namespace resource { class AbstractResource; class ComputingResource; class ComputingResourceType; class ComputingResourceReservation; class RequiredResourceCapability; class ResourceManager { private: static ResourceManager* singleton; // Mutable properties that need to be accessed via getter-/setter-functions. private: std::mutex managerMutex; std::map computingResourceTypes; std::map computingResources; private: static std::atomic _nextResourceId; static wfr_id_t getNextResourceId() { return _nextResourceId.fetch_add(1); } // Non-public functions private: ResourceManager(std::string resourceConfigFile, bool cpuAutoConfig, bool printResourceTable); void readConfigFile(std::string configFile); // Public static functions public: static void init(int argc, char** argv); static void finish() noexcept; static ResourceManager& getInstance() noexcept; // Public functions public: ~ResourceManager() noexcept; wfr_size_t getComputingResourceCount() const noexcept { return computingResources.size(); } std::vector getComputingResources() const noexcept; ComputingResource* getComputingResource(std::string identifier) const noexcept; std::vector filterComputingResources(std::vector filter) const noexcept; std::shared_ptr reserveComputingResource(ComputingResource* device, const wfr_size_t& slots, bool requireFreeSlots = false) noexcept; bool releaseComputingResources(ComputingResourceReservation* handle) noexcept; wfr_size_t getComputingResourceTypeCount() const noexcept { return computingResourceTypes.size(); } std::vector getComputingResourceTypes() const noexcept; std::vector getCompatibleComputingResourceTypes(wfs::AtomicActivityInstance* activity) const noexcept; ComputingResourceType* getComputingResourceType(std::string name) const noexcept; void printResourceTable(std::ostream& out) const noexcept; }; } /* namespace resource */ } /* namespace wfr */