Files
eden/src/core/hle/kernel/resource_limit.h
T

104 lines
2.9 KiB
C++
Raw Normal View History

// Copyright 2015 Citra Emulator Project
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
#pragma once
2018-11-19 12:54:06 -05:00
#include <array>
#include "common/common_types.h"
#include "core/hle/kernel/object.h"
2018-11-19 12:54:06 -05:00
union ResultCode;
namespace Kernel {
2018-08-28 12:30:33 -04:00
class KernelCore;
enum class ResourceType : u32 {
2018-11-19 12:54:06 -05:00
PhysicalMemory,
Threads,
Events,
TransferMemory,
Sessions,
// Used as a count, not an actual type.
ResourceTypeCount
};
constexpr bool IsValidResourceType(ResourceType type) {
return type < ResourceType::ResourceTypeCount;
}
class ResourceLimit final : public Object {
public:
/**
* Creates a resource limit object.
*/
2018-08-28 12:30:33 -04:00
static SharedPtr<ResourceLimit> Create(KernelCore& kernel, std::string name = "Unknown");
2016-09-18 09:38:01 +09:00
std::string GetTypeName() const override {
return "ResourceLimit";
}
std::string GetName() const override {
return name;
}
static const HandleType HANDLE_TYPE = HandleType::ResourceLimit;
2016-09-18 09:38:01 +09:00
HandleType GetHandleType() const override {
return HANDLE_TYPE;
}
/**
* Gets the current value for the specified resource.
* @param resource Requested resource type
* @returns The current value of the resource type
*/
2018-11-19 12:54:06 -05:00
s64 GetCurrentResourceValue(ResourceType resource) const;
/**
* Gets the max value for the specified resource.
* @param resource Requested resource type
* @returns The max value of the resource type
*/
2018-11-19 12:54:06 -05:00
s64 GetMaxResourceValue(ResourceType resource) const;
2018-11-19 12:54:06 -05:00
/**
* Sets the limit value for a given resource type.
*
* @param resource The resource type to apply the limit to.
* @param value The limit to apply to the given resource type.
*
* @return A result code indicating if setting the limit value
* was successful or not.
*
* @note The supplied limit value *must* be greater than or equal to
* the current resource value for the given resource type,
* otherwise ERR_INVALID_STATE will be returned.
*/
ResultCode SetLimitValue(ResourceType resource, s64 value);
2018-11-19 12:54:06 -05:00
private:
explicit ResourceLimit(KernelCore& kernel);
~ResourceLimit() override;
2018-11-19 12:54:06 -05:00
// TODO(Subv): Increment resource limit current values in their respective Kernel::T::Create
// functions
//
// Currently we have no way of distinguishing if a Create was called by the running application,
2016-09-18 09:38:01 +09:00
// or by a service module. Approach this once we have separated the service modules into their
// own processes
2018-11-19 12:54:06 -05:00
using ResourceArray =
std::array<s64, static_cast<std::size_t>(ResourceType::ResourceTypeCount)>;
2018-11-19 12:54:06 -05:00
/// Maximum values a resource type may reach.
ResourceArray limits{};
/// Current resource limit values.
ResourceArray values{};
2018-11-19 12:54:06 -05:00
/// Name of resource limit object.
std::string name;
};
} // namespace Kernel