diff options
author | Kyle Edwards <kyle.edwards@kitware.com> | 2019-07-08 21:09:34 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2019-10-02 13:33:54 (GMT) |
commit | c494b2973a1557c3373a2841ba39da6b8d4bdb5a (patch) | |
tree | 09a5508bf005d7518beed699db52c4dbd3a64d36 /Source/CTest | |
parent | c8f48069430cb286ca593a967e0c3b8e5ea842c4 (diff) | |
download | CMake-c494b2973a1557c3373a2841ba39da6b8d4bdb5a.zip CMake-c494b2973a1557c3373a2841ba39da6b8d4bdb5a.tar.gz CMake-c494b2973a1557c3373a2841ba39da6b8d4bdb5a.tar.bz2 |
CTest: Add cmCTestHardwareAllocator class
Diffstat (limited to 'Source/CTest')
-rw-r--r-- | Source/CTest/cmCTestHardwareAllocator.cxx | 86 | ||||
-rw-r--r-- | Source/CTest/cmCTestHardwareAllocator.h | 39 |
2 files changed, 125 insertions, 0 deletions
diff --git a/Source/CTest/cmCTestHardwareAllocator.cxx b/Source/CTest/cmCTestHardwareAllocator.cxx new file mode 100644 index 0000000..2d1833d --- /dev/null +++ b/Source/CTest/cmCTestHardwareAllocator.cxx @@ -0,0 +1,86 @@ +/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying + file Copyright.txt or https://cmake.org/licensing for details. */ + +#include "cmCTestHardwareAllocator.h" + +#include <utility> +#include <vector> + +#include "cmCTestHardwareSpec.h" + +void cmCTestHardwareAllocator::InitializeFromHardwareSpec( + const cmCTestHardwareSpec& spec) +{ + this->Resources.clear(); + + for (auto const& it : spec.LocalSocket.Resources) { + auto& res = this->Resources[it.first]; + for (auto const& specRes : it.second) { + res[specRes.Id].Total = specRes.Capacity; + res[specRes.Id].Locked = 0; + } + } +} + +const std::map<std::string, + std::map<std::string, cmCTestHardwareAllocator::Resource>>& +cmCTestHardwareAllocator::GetResources() const +{ + return this->Resources; +} + +bool cmCTestHardwareAllocator::AllocateResource(const std::string& name, + const std::string& id, + unsigned int slots) +{ + auto it = this->Resources.find(name); + if (it == this->Resources.end()) { + return false; + } + + auto resIt = it->second.find(id); + if (resIt == it->second.end()) { + return false; + } + + if (resIt->second.Total < resIt->second.Locked + slots) { + return false; + } + + resIt->second.Locked += slots; + return true; +} + +bool cmCTestHardwareAllocator::DeallocateResource(const std::string& name, + const std::string& id, + unsigned int slots) +{ + auto it = this->Resources.find(name); + if (it == this->Resources.end()) { + return false; + } + + auto resIt = it->second.find(id); + if (resIt == it->second.end()) { + return false; + } + + if (resIt->second.Locked < slots) { + return false; + } + + resIt->second.Locked -= slots; + return true; +} + +bool cmCTestHardwareAllocator::Resource::operator==( + const Resource& other) const +{ + return this->Total == other.Total && this->Locked == other.Locked; +} + +bool cmCTestHardwareAllocator::Resource::operator!=( + const Resource& other) const +{ + return !(*this == other); +} diff --git a/Source/CTest/cmCTestHardwareAllocator.h b/Source/CTest/cmCTestHardwareAllocator.h new file mode 100644 index 0000000..441f84d --- /dev/null +++ b/Source/CTest/cmCTestHardwareAllocator.h @@ -0,0 +1,39 @@ +/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying + file Copyright.txt or https://cmake.org/licensing for details. */ +#ifndef cmCTestHardwareAllocator_h +#define cmCTestHardwareAllocator_h + +#include <map> +#include <string> + +class cmCTestHardwareSpec; + +class cmCTestHardwareAllocator +{ +public: + struct Resource + { + unsigned int Total; + unsigned int Locked; + + unsigned int Free() const { return this->Total - this->Locked; } + + bool operator==(const Resource& other) const; + bool operator!=(const Resource& other) const; + }; + + void InitializeFromHardwareSpec(const cmCTestHardwareSpec& spec); + + const std::map<std::string, std::map<std::string, Resource>>& GetResources() + const; + + bool AllocateResource(const std::string& name, const std::string& id, + unsigned int slots); + bool DeallocateResource(const std::string& name, const std::string& id, + unsigned int slots); + +private: + std::map<std::string, std::map<std::string, Resource>> Resources; +}; + +#endif |