mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 00:49:02 -06:00 
			
		
		
		
	kernel: Remove unused address_arbiter code.
This commit is contained in:
		@@ -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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 * @param new_thread The thread to switch to
 | 
			
		||||
 
 | 
			
		||||
@@ -259,18 +259,6 @@ bool HaveReadyThreads();
 | 
			
		||||
 */
 | 
			
		||||
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
 | 
			
		||||
 */
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user