kernel/svc: Move address arbiter signaling behind a unified API function
Similar to how WaitForAddress was isolated to its own function, we can also move the necessary conditional checking into the address arbiter class itself, allowing us to hide the implementation details of it from public use.
This commit is contained in:
parent
0209de123b
commit
b7f331afa3
3 changed files with 26 additions and 22 deletions
|
@ -42,7 +42,21 @@ void WakeThreads(const std::vector<SharedPtr<Thread>>& waiting_threads, s32 num_
|
||||||
AddressArbiter::AddressArbiter(Core::System& system) : system{system} {}
|
AddressArbiter::AddressArbiter(Core::System& system) : system{system} {}
|
||||||
AddressArbiter::~AddressArbiter() = default;
|
AddressArbiter::~AddressArbiter() = default;
|
||||||
|
|
||||||
ResultCode AddressArbiter::SignalToAddress(VAddr address, s32 num_to_wake) {
|
ResultCode AddressArbiter::SignalToAddress(VAddr address, SignalType type, s32 value,
|
||||||
|
s32 num_to_wake) {
|
||||||
|
switch (type) {
|
||||||
|
case SignalType::Signal:
|
||||||
|
return SignalToAddressOnly(address, num_to_wake);
|
||||||
|
case SignalType::IncrementAndSignalIfEqual:
|
||||||
|
return IncrementAndSignalToAddressIfEqual(address, value, num_to_wake);
|
||||||
|
case SignalType::ModifyByWaitingCountAndSignalIfEqual:
|
||||||
|
return ModifyByWaitingCountAndSignalToAddressIfEqual(address, value, num_to_wake);
|
||||||
|
default:
|
||||||
|
return ERR_INVALID_ENUM_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ResultCode AddressArbiter::SignalToAddressOnly(VAddr address, s32 num_to_wake) {
|
||||||
const std::vector<SharedPtr<Thread>> waiting_threads = GetThreadsWaitingOnAddress(address);
|
const std::vector<SharedPtr<Thread>> waiting_threads = GetThreadsWaitingOnAddress(address);
|
||||||
WakeThreads(waiting_threads, num_to_wake);
|
WakeThreads(waiting_threads, num_to_wake);
|
||||||
return RESULT_SUCCESS;
|
return RESULT_SUCCESS;
|
||||||
|
@ -60,7 +74,7 @@ ResultCode AddressArbiter::IncrementAndSignalToAddressIfEqual(VAddr address, s32
|
||||||
}
|
}
|
||||||
|
|
||||||
Memory::Write32(address, static_cast<u32>(value + 1));
|
Memory::Write32(address, static_cast<u32>(value + 1));
|
||||||
return SignalToAddress(address, num_to_wake);
|
return SignalToAddressOnly(address, num_to_wake);
|
||||||
}
|
}
|
||||||
|
|
||||||
ResultCode AddressArbiter::ModifyByWaitingCountAndSignalToAddressIfEqual(VAddr address, s32 value,
|
ResultCode AddressArbiter::ModifyByWaitingCountAndSignalToAddressIfEqual(VAddr address, s32 value,
|
||||||
|
|
|
@ -40,8 +40,15 @@ public:
|
||||||
AddressArbiter(AddressArbiter&&) = default;
|
AddressArbiter(AddressArbiter&&) = default;
|
||||||
AddressArbiter& operator=(AddressArbiter&&) = delete;
|
AddressArbiter& operator=(AddressArbiter&&) = delete;
|
||||||
|
|
||||||
|
/// Signals an address being waited on with a particular signaling type.
|
||||||
|
ResultCode SignalToAddress(VAddr address, SignalType type, s32 value, s32 num_to_wake);
|
||||||
|
|
||||||
|
/// Waits on an address with a particular arbitration type.
|
||||||
|
ResultCode WaitForAddress(VAddr address, ArbitrationType type, s32 value, s64 timeout_ns);
|
||||||
|
|
||||||
|
private:
|
||||||
/// Signals an address being waited on.
|
/// Signals an address being waited on.
|
||||||
ResultCode SignalToAddress(VAddr address, s32 num_to_wake);
|
ResultCode SignalToAddressOnly(VAddr address, s32 num_to_wake);
|
||||||
|
|
||||||
/// Signals an address being waited on and increments its value if equal to the value argument.
|
/// Signals an address being waited on and increments its value if equal to the value argument.
|
||||||
ResultCode IncrementAndSignalToAddressIfEqual(VAddr address, s32 value, s32 num_to_wake);
|
ResultCode IncrementAndSignalToAddressIfEqual(VAddr address, s32 value, s32 num_to_wake);
|
||||||
|
@ -51,10 +58,6 @@ public:
|
||||||
ResultCode ModifyByWaitingCountAndSignalToAddressIfEqual(VAddr address, s32 value,
|
ResultCode ModifyByWaitingCountAndSignalToAddressIfEqual(VAddr address, s32 value,
|
||||||
s32 num_to_wake);
|
s32 num_to_wake);
|
||||||
|
|
||||||
/// Waits on an address with a particular arbitration type.
|
|
||||||
ResultCode WaitForAddress(VAddr address, ArbitrationType type, s32 value, s64 timeout_ns);
|
|
||||||
|
|
||||||
private:
|
|
||||||
/// Waits on an address if the value passed is less than the argument value,
|
/// Waits on an address if the value passed is less than the argument value,
|
||||||
/// optionally decrementing.
|
/// optionally decrementing.
|
||||||
ResultCode WaitForAddressIfLessThan(VAddr address, s32 value, s64 timeout,
|
ResultCode WaitForAddressIfLessThan(VAddr address, s32 value, s64 timeout,
|
||||||
|
|
|
@ -1499,22 +1499,9 @@ static ResultCode SignalToAddress(VAddr address, u32 type, s32 value, s32 num_to
|
||||||
return ERR_INVALID_ADDRESS;
|
return ERR_INVALID_ADDRESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const auto signal_type = static_cast<AddressArbiter::SignalType>(type);
|
||||||
auto& address_arbiter = Core::System::GetInstance().Kernel().AddressArbiter();
|
auto& address_arbiter = Core::System::GetInstance().Kernel().AddressArbiter();
|
||||||
switch (static_cast<AddressArbiter::SignalType>(type)) {
|
return address_arbiter.SignalToAddress(address, signal_type, value, num_to_wake);
|
||||||
case AddressArbiter::SignalType::Signal:
|
|
||||||
return address_arbiter.SignalToAddress(address, num_to_wake);
|
|
||||||
case AddressArbiter::SignalType::IncrementAndSignalIfEqual:
|
|
||||||
return address_arbiter.IncrementAndSignalToAddressIfEqual(address, value, num_to_wake);
|
|
||||||
case AddressArbiter::SignalType::ModifyByWaitingCountAndSignalIfEqual:
|
|
||||||
return address_arbiter.ModifyByWaitingCountAndSignalToAddressIfEqual(address, value,
|
|
||||||
num_to_wake);
|
|
||||||
default:
|
|
||||||
LOG_ERROR(Kernel_SVC,
|
|
||||||
"Invalid signal type, expected Signal, IncrementAndSignalIfEqual "
|
|
||||||
"or ModifyByWaitingCountAndSignalIfEqual but got {}",
|
|
||||||
type);
|
|
||||||
return ERR_INVALID_ENUM_VALUE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// This returns the total CPU ticks elapsed since the CPU was powered-on
|
/// This returns the total CPU ticks elapsed since the CPU was powered-on
|
||||||
|
|
Loading…
Reference in a new issue