6 changed files with 0 additions and 150 deletions
-
2src/core/CMakeLists.txt
-
64src/core/hle/kernel/condition_variable.cpp
-
63src/core/hle/kernel/condition_variable.h
-
6src/core/hle/kernel/svc.cpp
-
9src/core/hle/kernel/thread.cpp
-
6src/core/hle/kernel/thread.h
@ -1,64 +0,0 @@ |
|||
// Copyright 2018 yuzu emulator team
|
|||
// Licensed under GPLv2 or any later version
|
|||
// Refer to the license.txt file included.
|
|||
|
|||
#include "common/assert.h"
|
|||
#include "core/hle/kernel/condition_variable.h"
|
|||
#include "core/hle/kernel/errors.h"
|
|||
#include "core/hle/kernel/kernel.h"
|
|||
#include "core/hle/kernel/object_address_table.h"
|
|||
#include "core/hle/kernel/thread.h"
|
|||
|
|||
namespace Kernel { |
|||
|
|||
ConditionVariable::ConditionVariable() {} |
|||
ConditionVariable::~ConditionVariable() {} |
|||
|
|||
ResultVal<SharedPtr<ConditionVariable>> ConditionVariable::Create(VAddr guest_addr, |
|||
std::string name) { |
|||
SharedPtr<ConditionVariable> condition_variable(new ConditionVariable); |
|||
|
|||
condition_variable->name = std::move(name); |
|||
condition_variable->guest_addr = guest_addr; |
|||
condition_variable->mutex_addr = 0; |
|||
|
|||
// Condition variables are referenced by guest address, so track this in the kernel
|
|||
g_object_address_table.Insert(guest_addr, condition_variable); |
|||
|
|||
return MakeResult<SharedPtr<ConditionVariable>>(std::move(condition_variable)); |
|||
} |
|||
|
|||
bool ConditionVariable::ShouldWait(Thread* thread) const { |
|||
return GetAvailableCount() <= 0; |
|||
} |
|||
|
|||
void ConditionVariable::Acquire(Thread* thread) { |
|||
if (GetAvailableCount() <= 0) |
|||
return; |
|||
|
|||
SetAvailableCount(GetAvailableCount() - 1); |
|||
} |
|||
|
|||
ResultCode ConditionVariable::Release(s32 target) { |
|||
if (target == -1) { |
|||
// When -1, wake up all waiting threads
|
|||
SetAvailableCount(static_cast<s32>(GetWaitingThreads().size())); |
|||
WakeupAllWaitingThreads(); |
|||
} else { |
|||
// Otherwise, wake up just a single thread
|
|||
SetAvailableCount(target); |
|||
WakeupWaitingThread(GetHighestPriorityReadyThread()); |
|||
} |
|||
|
|||
return RESULT_SUCCESS; |
|||
} |
|||
|
|||
s32 ConditionVariable::GetAvailableCount() const { |
|||
return Memory::Read32(guest_addr); |
|||
} |
|||
|
|||
void ConditionVariable::SetAvailableCount(s32 value) const { |
|||
Memory::Write32(guest_addr, value); |
|||
} |
|||
|
|||
} // namespace Kernel
|
|||
@ -1,63 +0,0 @@ |
|||
// Copyright 2018 yuzu emulator team |
|||
// Licensed under GPLv2 or any later version |
|||
// Refer to the license.txt file included. |
|||
|
|||
#pragma once |
|||
|
|||
#include <string> |
|||
#include <queue> |
|||
#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 name Optional name of condition variable. |
|||
* @return The created condition variable. |
|||
*/ |
|||
static ResultVal<SharedPtr<ConditionVariable>> Create(VAddr guest_addr, |
|||
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 |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue