summaryrefslogtreecommitdiffstats
path: root/src/core/hle/kernel/address_arbiter.h
diff options
context:
space:
mode:
authorLioncash <mathew1800@gmail.com>2019-03-05 17:54:06 +0100
committerLioncash <mathew1800@gmail.com>2019-03-05 18:58:26 +0100
commitec6664f6d61f46569a2686b864ba3e9a0f85fc60 (patch)
tree67a78607f085efd3e4258fd90afd2aa2036d0448 /src/core/hle/kernel/address_arbiter.h
parentMerge pull request #2185 from FearlessTobi/port-4630 (diff)
downloadyuzu-ec6664f6d61f46569a2686b864ba3e9a0f85fc60.tar
yuzu-ec6664f6d61f46569a2686b864ba3e9a0f85fc60.tar.gz
yuzu-ec6664f6d61f46569a2686b864ba3e9a0f85fc60.tar.bz2
yuzu-ec6664f6d61f46569a2686b864ba3e9a0f85fc60.tar.lz
yuzu-ec6664f6d61f46569a2686b864ba3e9a0f85fc60.tar.xz
yuzu-ec6664f6d61f46569a2686b864ba3e9a0f85fc60.tar.zst
yuzu-ec6664f6d61f46569a2686b864ba3e9a0f85fc60.zip
Diffstat (limited to '')
-rw-r--r--src/core/hle/kernel/address_arbiter.h68
1 files changed, 51 insertions, 17 deletions
diff --git a/src/core/hle/kernel/address_arbiter.h b/src/core/hle/kernel/address_arbiter.h
index b58f21bec..6f46190f6 100644
--- a/src/core/hle/kernel/address_arbiter.h
+++ b/src/core/hle/kernel/address_arbiter.h
@@ -5,28 +5,62 @@
#pragma once
#include "common/common_types.h"
+#include "core/hle/kernel/address_arbiter.h"
union ResultCode;
-namespace Kernel::AddressArbiter {
+namespace Kernel {
-enum class ArbitrationType {
- WaitIfLessThan = 0,
- DecrementAndWaitIfLessThan = 1,
- WaitIfEqual = 2,
-};
+class Thread;
-enum class SignalType {
- Signal = 0,
- IncrementAndSignalIfEqual = 1,
- ModifyByWaitingCountAndSignalIfEqual = 2,
-};
+class AddressArbiter {
+public:
+ enum class ArbitrationType {
+ WaitIfLessThan = 0,
+ DecrementAndWaitIfLessThan = 1,
+ WaitIfEqual = 2,
+ };
+
+ enum class SignalType {
+ Signal = 0,
+ IncrementAndSignalIfEqual = 1,
+ ModifyByWaitingCountAndSignalIfEqual = 2,
+ };
+
+ AddressArbiter();
+ ~AddressArbiter();
+
+ AddressArbiter(const AddressArbiter&) = delete;
+ AddressArbiter& operator=(const AddressArbiter&) = delete;
+
+ AddressArbiter(AddressArbiter&&) = default;
+ AddressArbiter& operator=(AddressArbiter&&) = delete;
-ResultCode SignalToAddress(VAddr address, s32 num_to_wake);
-ResultCode IncrementAndSignalToAddressIfEqual(VAddr address, s32 value, s32 num_to_wake);
-ResultCode ModifyByWaitingCountAndSignalToAddressIfEqual(VAddr address, s32 value, s32 num_to_wake);
+ /// Signals an address being waited on.
+ ResultCode SignalToAddress(VAddr address, s32 num_to_wake);
-ResultCode WaitForAddressIfLessThan(VAddr address, s32 value, s64 timeout, bool should_decrement);
-ResultCode WaitForAddressIfEqual(VAddr address, s32 value, s64 timeout);
+ /// 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);
+
+ /// Signals an address being waited on and modifies its value based on waiting thread count if
+ /// equal to the value argument.
+ ResultCode ModifyByWaitingCountAndSignalToAddressIfEqual(VAddr address, s32 value,
+ s32 num_to_wake);
+
+ /// Waits on an address if the value passed is less than the argument value,
+ /// optionally decrementing.
+ ResultCode WaitForAddressIfLessThan(VAddr address, s32 value, s64 timeout,
+ bool should_decrement);
+
+ /// Waits on an address if the value passed is equal to the argument value.
+ ResultCode WaitForAddressIfEqual(VAddr address, s32 value, s64 timeout);
+
+private:
+ // Waits on the given address with a timeout in nanoseconds
+ ResultCode WaitForAddress(VAddr address, s64 timeout);
+
+ // Gets the threads waiting on an address.
+ std::vector<SharedPtr<Thread>> GetThreadsWaitingOnAddress(VAddr address) const;
+};
-} // namespace Kernel::AddressArbiter
+} // namespace Kernel