forked from ShuriZma/suyu
kernel: Remove unused address_arbiter code.
This commit is contained in:
parent
de43db3400
commit
cec0d4f191
|
@ -28,8 +28,6 @@ add_library(core STATIC
|
||||||
hle/config_mem.h
|
hle/config_mem.h
|
||||||
hle/ipc.h
|
hle/ipc.h
|
||||||
hle/ipc_helpers.h
|
hle/ipc_helpers.h
|
||||||
hle/kernel/address_arbiter.cpp
|
|
||||||
hle/kernel/address_arbiter.h
|
|
||||||
hle/kernel/client_port.cpp
|
hle/kernel/client_port.cpp
|
||||||
hle/kernel/client_port.h
|
hle/kernel/client_port.h
|
||||||
hle/kernel/client_session.cpp
|
hle/kernel/client_session.cpp
|
||||||
|
|
|
@ -1,91 +0,0 @@
|
||||||
// Copyright 2014 Citra Emulator Project
|
|
||||||
// Licensed under GPLv2 or any later version
|
|
||||||
// Refer to the license.txt file included.
|
|
||||||
|
|
||||||
#include "common/common_types.h"
|
|
||||||
#include "common/logging/log.h"
|
|
||||||
#include "core/hle/kernel/address_arbiter.h"
|
|
||||||
#include "core/hle/kernel/errors.h"
|
|
||||||
#include "core/hle/kernel/thread.h"
|
|
||||||
#include "core/memory.h"
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
// Kernel namespace
|
|
||||||
|
|
||||||
namespace Kernel {
|
|
||||||
|
|
||||||
AddressArbiter::AddressArbiter() {}
|
|
||||||
AddressArbiter::~AddressArbiter() {}
|
|
||||||
|
|
||||||
SharedPtr<AddressArbiter> AddressArbiter::Create(std::string name) {
|
|
||||||
SharedPtr<AddressArbiter> address_arbiter(new AddressArbiter);
|
|
||||||
|
|
||||||
address_arbiter->name = std::move(name);
|
|
||||||
|
|
||||||
return address_arbiter;
|
|
||||||
}
|
|
||||||
|
|
||||||
ResultCode AddressArbiter::ArbitrateAddress(ArbitrationType type, VAddr address, s32 value,
|
|
||||||
u64 nanoseconds) {
|
|
||||||
switch (type) {
|
|
||||||
|
|
||||||
// Signal thread(s) waiting for arbitrate address...
|
|
||||||
case ArbitrationType::Signal:
|
|
||||||
// Negative value means resume all threads
|
|
||||||
if (value < 0) {
|
|
||||||
ArbitrateAllThreads(address);
|
|
||||||
} else {
|
|
||||||
// Resume first N threads
|
|
||||||
for (int i = 0; i < value; i++)
|
|
||||||
ArbitrateHighestPriorityThread(address);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
// Wait current thread (acquire the arbiter)...
|
|
||||||
case ArbitrationType::WaitIfLessThan:
|
|
||||||
if ((s32)Memory::Read32(address) < value) {
|
|
||||||
Kernel::WaitCurrentThread_ArbitrateAddress(address);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ArbitrationType::WaitIfLessThanWithTimeout:
|
|
||||||
if ((s32)Memory::Read32(address) < value) {
|
|
||||||
Kernel::WaitCurrentThread_ArbitrateAddress(address);
|
|
||||||
GetCurrentThread()->WakeAfterDelay(nanoseconds);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ArbitrationType::DecrementAndWaitIfLessThan: {
|
|
||||||
s32 memory_value = Memory::Read32(address);
|
|
||||||
if (memory_value < value) {
|
|
||||||
// Only change the memory value if the thread should wait
|
|
||||||
Memory::Write32(address, (s32)memory_value - 1);
|
|
||||||
Kernel::WaitCurrentThread_ArbitrateAddress(address);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ArbitrationType::DecrementAndWaitIfLessThanWithTimeout: {
|
|
||||||
s32 memory_value = Memory::Read32(address);
|
|
||||||
if (memory_value < value) {
|
|
||||||
// Only change the memory value if the thread should wait
|
|
||||||
Memory::Write32(address, (s32)memory_value - 1);
|
|
||||||
Kernel::WaitCurrentThread_ArbitrateAddress(address);
|
|
||||||
GetCurrentThread()->WakeAfterDelay(nanoseconds);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
LOG_ERROR(Kernel, "unknown type=%d", type);
|
|
||||||
return ERR_INVALID_ENUM_VALUE_FND;
|
|
||||||
}
|
|
||||||
|
|
||||||
// The calls that use a timeout seem to always return a Timeout error even if they did not put
|
|
||||||
// the thread to sleep
|
|
||||||
if (type == ArbitrationType::WaitIfLessThanWithTimeout ||
|
|
||||||
type == ArbitrationType::DecrementAndWaitIfLessThanWithTimeout) {
|
|
||||||
|
|
||||||
return RESULT_TIMEOUT;
|
|
||||||
}
|
|
||||||
return RESULT_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace Kernel
|
|
|
@ -1,60 +0,0 @@
|
||||||
// Copyright 2014 Citra Emulator Project
|
|
||||||
// Licensed under GPLv2 or any later version
|
|
||||||
// Refer to the license.txt file included.
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "common/common_types.h"
|
|
||||||
#include "core/hle/kernel/kernel.h"
|
|
||||||
#include "core/hle/result.h"
|
|
||||||
|
|
||||||
// Address arbiters are an underlying kernel synchronization object that can be created/used via
|
|
||||||
// supervisor calls (SVCs). They function as sort of a global lock. Typically, games/other CTR
|
|
||||||
// applications use them as an underlying mechanism to implement thread-safe barriers, events, and
|
|
||||||
// semphores.
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
// Kernel namespace
|
|
||||||
|
|
||||||
namespace Kernel {
|
|
||||||
|
|
||||||
enum class ArbitrationType : u32 {
|
|
||||||
Signal,
|
|
||||||
WaitIfLessThan,
|
|
||||||
DecrementAndWaitIfLessThan,
|
|
||||||
WaitIfLessThanWithTimeout,
|
|
||||||
DecrementAndWaitIfLessThanWithTimeout,
|
|
||||||
};
|
|
||||||
|
|
||||||
class AddressArbiter final : public Object {
|
|
||||||
public:
|
|
||||||
/**
|
|
||||||
* Creates an address arbiter.
|
|
||||||
*
|
|
||||||
* @param name Optional name used for debugging.
|
|
||||||
* @returns The created AddressArbiter.
|
|
||||||
*/
|
|
||||||
static SharedPtr<AddressArbiter> Create(std::string name = "Unknown");
|
|
||||||
|
|
||||||
std::string GetTypeName() const override {
|
|
||||||
return "Arbiter";
|
|
||||||
}
|
|
||||||
std::string GetName() const override {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const HandleType HANDLE_TYPE = HandleType::AddressArbiter;
|
|
||||||
HandleType GetHandleType() const override {
|
|
||||||
return HANDLE_TYPE;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string name; ///< Name of address arbiter object (optional)
|
|
||||||
|
|
||||||
ResultCode ArbitrateAddress(ArbitrationType type, VAddr address, s32 value, u64 nanoseconds);
|
|
||||||
|
|
||||||
private:
|
|
||||||
AddressArbiter();
|
|
||||||
~AddressArbiter() override;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace Kernel
|
|
|
@ -109,40 +109,6 @@ void Thread::Stop() {
|
||||||
Kernel::g_current_process->tls_slots[tls_page].reset(tls_slot);
|
Kernel::g_current_process->tls_slots[tls_page].reset(tls_slot);
|
||||||
}
|
}
|
||||||
|
|
||||||
Thread* ArbitrateHighestPriorityThread(u32 address) {
|
|
||||||
Thread* highest_priority_thread = nullptr;
|
|
||||||
u32 priority = THREADPRIO_LOWEST;
|
|
||||||
|
|
||||||
// Iterate through threads, find highest priority thread that is waiting to be arbitrated...
|
|
||||||
for (auto& thread : thread_list) {
|
|
||||||
if (!CheckWait_AddressArbiter(thread.get(), address))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (thread == nullptr)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (thread->current_priority <= priority) {
|
|
||||||
highest_priority_thread = thread.get();
|
|
||||||
priority = thread->current_priority;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If a thread was arbitrated, resume it
|
|
||||||
if (nullptr != highest_priority_thread) {
|
|
||||||
highest_priority_thread->ResumeFromWait();
|
|
||||||
}
|
|
||||||
|
|
||||||
return highest_priority_thread;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ArbitrateAllThreads(u32 address) {
|
|
||||||
// Resume all threads found to be waiting on the address
|
|
||||||
for (auto& thread : thread_list) {
|
|
||||||
if (CheckWait_AddressArbiter(thread.get(), address))
|
|
||||||
thread->ResumeFromWait();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Switches the CPU's active thread context to that of the specified thread
|
* Switches the CPU's active thread context to that of the specified thread
|
||||||
* @param new_thread The thread to switch to
|
* @param new_thread The thread to switch to
|
||||||
|
|
|
@ -259,18 +259,6 @@ bool HaveReadyThreads();
|
||||||
*/
|
*/
|
||||||
void Reschedule();
|
void Reschedule();
|
||||||
|
|
||||||
/**
|
|
||||||
* Arbitrate the highest priority thread that is waiting
|
|
||||||
* @param address The address for which waiting threads should be arbitrated
|
|
||||||
*/
|
|
||||||
Thread* ArbitrateHighestPriorityThread(VAddr address);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Arbitrate all threads currently waiting.
|
|
||||||
* @param address The address for which waiting threads should be arbitrated
|
|
||||||
*/
|
|
||||||
void ArbitrateAllThreads(VAddr address);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the current thread
|
* Gets the current thread
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue