|
|
|
@ -2,21 +2,16 @@ |
|
|
|
// Licensed under GPLv2 or any later version
|
|
|
|
// Refer to the license.txt file included.
|
|
|
|
|
|
|
|
// This file references various implementation details from Atmosphere, an open-source firmware for
|
|
|
|
// the Nintendo Switch. Copyright 2018-2020 Atmosphere-NX.
|
|
|
|
|
|
|
|
#include "common/assert.h"
|
|
|
|
#include "core/core.h"
|
|
|
|
#include "core/core_timing.h"
|
|
|
|
#include "core/core_timing_util.h"
|
|
|
|
#include "core/hle/kernel/k_resource_limit.h"
|
|
|
|
#include "core/hle/kernel/svc_results.h"
|
|
|
|
|
|
|
|
namespace Kernel { |
|
|
|
constexpr s64 DefaultTimeout = 10000000000; // 10 seconds
|
|
|
|
|
|
|
|
KResourceLimit::KResourceLimit(KernelCore& kernel, Core::System& system) |
|
|
|
: Object{kernel}, lock{kernel}, cond_var{kernel}, kernel{kernel}, system(system) {} |
|
|
|
KResourceLimit::KResourceLimit(KernelCore& kernel, const Core::Timing::CoreTiming& core_timing_) |
|
|
|
: Object{kernel}, lock{kernel}, cond_var{kernel}, core_timing(core_timing_) {} |
|
|
|
KResourceLimit::~KResourceLimit() = default; |
|
|
|
|
|
|
|
s64 KResourceLimit::GetLimitValue(LimitableResource which) const { |
|
|
|
@ -83,7 +78,7 @@ ResultCode KResourceLimit::SetLimitValue(LimitableResource which, s64 value) { |
|
|
|
} |
|
|
|
|
|
|
|
bool KResourceLimit::Reserve(LimitableResource which, s64 value) { |
|
|
|
return Reserve(which, value, system.CoreTiming().GetGlobalTimeNs().count() + DefaultTimeout); |
|
|
|
return Reserve(which, value, core_timing.GetGlobalTimeNs().count() + DefaultTimeout); |
|
|
|
} |
|
|
|
|
|
|
|
bool KResourceLimit::Reserve(LimitableResource which, s64 value, s64 timeout) { |
|
|
|
@ -114,7 +109,7 @@ bool KResourceLimit::Reserve(LimitableResource which, s64 value, s64 timeout) { |
|
|
|
} |
|
|
|
|
|
|
|
if (current_hints[index] + value <= limit_values[index] && |
|
|
|
(timeout < 0 || system.CoreTiming().GetGlobalTimeNs().count() < timeout)) { |
|
|
|
(timeout < 0 || core_timing.GetGlobalTimeNs().count() < timeout)) { |
|
|
|
waiter_count++; |
|
|
|
cond_var.Wait(&lock, timeout); |
|
|
|
waiter_count--; |
|
|
|
|