You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
2.1 KiB
87 lines
2.1 KiB
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
file Copyright.txt or https://cmake.org/licensing for details. */
|
|
|
|
#include "cmCTestResourceAllocator.h"
|
|
|
|
#include <utility>
|
|
#include <vector>
|
|
|
|
#include "cmCTestResourceSpec.h"
|
|
|
|
void cmCTestResourceAllocator::InitializeFromResourceSpec(
|
|
const cmCTestResourceSpec& 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, cmCTestResourceAllocator::Resource>>&
|
|
cmCTestResourceAllocator::GetResources() const
|
|
{
|
|
return this->Resources;
|
|
}
|
|
|
|
bool cmCTestResourceAllocator::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 cmCTestResourceAllocator::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 cmCTestResourceAllocator::Resource::operator==(
|
|
const Resource& other) const
|
|
{
|
|
return this->Total == other.Total && this->Locked == other.Locked;
|
|
}
|
|
|
|
bool cmCTestResourceAllocator::Resource::operator!=(
|
|
const Resource& other) const
|
|
{
|
|
return !(*this == other);
|
|
}
|