k_resource_limit.h 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include <array>
  5. #include "common/common_types.h"
  6. #include "core/hle/kernel/k_light_condition_variable.h"
  7. #include "core/hle/kernel/k_light_lock.h"
  8. union Result;
  9. namespace Core::Timing {
  10. class CoreTiming;
  11. }
  12. namespace Kernel {
  13. class KernelCore;
  14. using LimitableResource = Svc::LimitableResource;
  15. constexpr bool IsValidResourceType(LimitableResource type) {
  16. return type < LimitableResource::Count;
  17. }
  18. class KResourceLimit final
  19. : public KAutoObjectWithSlabHeapAndContainer<KResourceLimit, KAutoObjectWithList> {
  20. KERNEL_AUTOOBJECT_TRAITS(KResourceLimit, KAutoObject);
  21. public:
  22. explicit KResourceLimit(KernelCore& kernel_);
  23. ~KResourceLimit() override;
  24. void Initialize(const Core::Timing::CoreTiming* core_timing_);
  25. void Finalize() override;
  26. s64 GetLimitValue(LimitableResource which) const;
  27. s64 GetCurrentValue(LimitableResource which) const;
  28. s64 GetPeakValue(LimitableResource which) const;
  29. s64 GetFreeValue(LimitableResource which) const;
  30. Result SetLimitValue(LimitableResource which, s64 value);
  31. bool Reserve(LimitableResource which, s64 value);
  32. bool Reserve(LimitableResource which, s64 value, s64 timeout);
  33. void Release(LimitableResource which, s64 value);
  34. void Release(LimitableResource which, s64 value, s64 hint);
  35. static void PostDestroy([[maybe_unused]] uintptr_t arg) {}
  36. private:
  37. using ResourceArray = std::array<s64, static_cast<std::size_t>(LimitableResource::Count)>;
  38. ResourceArray limit_values{};
  39. ResourceArray current_values{};
  40. ResourceArray current_hints{};
  41. ResourceArray peak_values{};
  42. mutable KLightLock lock;
  43. s32 waiter_count{};
  44. KLightConditionVariable cond_var;
  45. const Core::Timing::CoreTiming* core_timing{};
  46. };
  47. KResourceLimit* CreateResourceLimitForProcess(Core::System& system, s64 physical_memory_size);
  48. } // namespace Kernel