diff options
author | bunnei <bunneidev@gmail.com> | 2018-01-09 03:41:37 +0100 |
---|---|---|
committer | bunnei <bunneidev@gmail.com> | 2018-01-09 03:41:37 +0100 |
commit | 423679983259948c203e546887445a59b64fc32f (patch) | |
tree | d359c88bb9347677025a9f0e64a08e0ab1733a4a /src/core/hle/kernel/condition_variable.h | |
parent | mutex: Remove unused call to VerifyGuestState. (diff) | |
download | yuzu-423679983259948c203e546887445a59b64fc32f.tar yuzu-423679983259948c203e546887445a59b64fc32f.tar.gz yuzu-423679983259948c203e546887445a59b64fc32f.tar.bz2 yuzu-423679983259948c203e546887445a59b64fc32f.tar.lz yuzu-423679983259948c203e546887445a59b64fc32f.tar.xz yuzu-423679983259948c203e546887445a59b64fc32f.tar.zst yuzu-423679983259948c203e546887445a59b64fc32f.zip |
Diffstat (limited to 'src/core/hle/kernel/condition_variable.h')
-rw-r--r-- | src/core/hle/kernel/condition_variable.h | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/src/core/hle/kernel/condition_variable.h b/src/core/hle/kernel/condition_variable.h new file mode 100644 index 000000000..27b8547c0 --- /dev/null +++ b/src/core/hle/kernel/condition_variable.h @@ -0,0 +1,65 @@ +// Copyright 2018 Yuzu Emulator Team +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include <queue> +#include <string> +#include "common/common_types.h" +#include "core/hle/kernel/kernel.h" +#include "core/hle/kernel/wait_object.h" +#include "core/hle/result.h" + +namespace Kernel { + +class ConditionVariable final : public WaitObject { +public: + /** + * Creates a condition variable. + * @param guest_addr Address of the object tracking the condition variable in guest memory. If + * specified, this condition variable will update the guest object when its state changes. + * @param mutex_addr Optional address of a guest mutex associated with this condition variable, + * used by the OS for implementing events. + * @param name Optional name of condition variable. + * @return The created condition variable. + */ + static ResultVal<SharedPtr<ConditionVariable>> Create(VAddr guest_addr, VAddr mutex_addr = 0, + std::string name = "Unknown"); + + std::string GetTypeName() const override { + return "ConditionVariable"; + } + std::string GetName() const override { + return name; + } + + static const HandleType HANDLE_TYPE = HandleType::ConditionVariable; + HandleType GetHandleType() const override { + return HANDLE_TYPE; + } + + s32 GetAvailableCount() const; + void SetAvailableCount(s32 value) const; + + std::string name; ///< Name of condition variable (optional) + VAddr guest_addr; ///< Address of the guest condition variable value + VAddr mutex_addr; ///< (optional) Address of guest mutex value associated with this condition + ///< variable, used for implementing events + + bool ShouldWait(Thread* thread) const override; + void Acquire(Thread* thread) override; + + /** + * Releases a slot from a condition variable. + * @param target The number of threads to wakeup, -1 is all. + * @return ResultCode indicating if the operation succeeded. + */ + ResultCode Release(s32 target); + +private: + ConditionVariable(); + ~ConditionVariable() override; +}; + +} // namespace Kernel |