address_arbiter.h 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // Copyright 2018 yuzu emulator team
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #pragma once
  5. #include <vector>
  6. #include "common/common_types.h"
  7. #include "core/hle/kernel/object.h"
  8. union ResultCode;
  9. namespace Core {
  10. class System;
  11. }
  12. namespace Kernel {
  13. class Thread;
  14. class AddressArbiter {
  15. public:
  16. enum class ArbitrationType {
  17. WaitIfLessThan = 0,
  18. DecrementAndWaitIfLessThan = 1,
  19. WaitIfEqual = 2,
  20. };
  21. enum class SignalType {
  22. Signal = 0,
  23. IncrementAndSignalIfEqual = 1,
  24. ModifyByWaitingCountAndSignalIfEqual = 2,
  25. };
  26. explicit AddressArbiter(Core::System& system);
  27. ~AddressArbiter();
  28. AddressArbiter(const AddressArbiter&) = delete;
  29. AddressArbiter& operator=(const AddressArbiter&) = delete;
  30. AddressArbiter(AddressArbiter&&) = default;
  31. AddressArbiter& operator=(AddressArbiter&&) = delete;
  32. /// Signals an address being waited on with a particular signaling type.
  33. ResultCode SignalToAddress(VAddr address, SignalType type, s32 value, s32 num_to_wake);
  34. /// Waits on an address with a particular arbitration type.
  35. ResultCode WaitForAddress(VAddr address, ArbitrationType type, s32 value, s64 timeout_ns);
  36. private:
  37. /// Signals an address being waited on.
  38. ResultCode SignalToAddressOnly(VAddr address, s32 num_to_wake);
  39. /// Signals an address being waited on and increments its value if equal to the value argument.
  40. ResultCode IncrementAndSignalToAddressIfEqual(VAddr address, s32 value, s32 num_to_wake);
  41. /// Signals an address being waited on and modifies its value based on waiting thread count if
  42. /// equal to the value argument.
  43. ResultCode ModifyByWaitingCountAndSignalToAddressIfEqual(VAddr address, s32 value,
  44. s32 num_to_wake);
  45. /// Waits on an address if the value passed is less than the argument value,
  46. /// optionally decrementing.
  47. ResultCode WaitForAddressIfLessThan(VAddr address, s32 value, s64 timeout,
  48. bool should_decrement);
  49. /// Waits on an address if the value passed is equal to the argument value.
  50. ResultCode WaitForAddressIfEqual(VAddr address, s32 value, s64 timeout);
  51. // Waits on the given address with a timeout in nanoseconds
  52. ResultCode WaitForAddressImpl(VAddr address, s64 timeout);
  53. // Gets the threads waiting on an address.
  54. std::vector<std::shared_ptr<Thread>> GetThreadsWaitingOnAddress(VAddr address) const;
  55. Core::System& system;
  56. };
  57. } // namespace Kernel