Merge pull request #7597 from bunnei/remove-global-lock
core: hle: Remove global HLE lock.
This commit is contained in:
		@@ -265,8 +265,6 @@ add_library(core STATIC
 | 
			
		||||
    hle/kernel/svc_wrap.h
 | 
			
		||||
    hle/kernel/time_manager.cpp
 | 
			
		||||
    hle/kernel/time_manager.h
 | 
			
		||||
    hle/lock.cpp
 | 
			
		||||
    hle/lock.h
 | 
			
		||||
    hle/result.h
 | 
			
		||||
    hle/service/acc/acc.cpp
 | 
			
		||||
    hle/service/acc/acc.h
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,6 @@
 | 
			
		||||
#include "core/hle/kernel/k_thread.h"
 | 
			
		||||
#include "core/hle/kernel/kernel.h"
 | 
			
		||||
#include "core/hle/kernel/svc_results.h"
 | 
			
		||||
#include "core/hle/lock.h"
 | 
			
		||||
#include "core/memory.h"
 | 
			
		||||
 | 
			
		||||
namespace Kernel {
 | 
			
		||||
@@ -543,7 +542,6 @@ void KProcess::FreeTLSRegion(VAddr tls_address) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void KProcess::LoadModule(CodeSet code_set, VAddr base_addr) {
 | 
			
		||||
    std::lock_guard lock{HLE::g_hle_lock};
 | 
			
		||||
    const auto ReprotectSegment = [&](const CodeSet::Segment& segment,
 | 
			
		||||
                                      KMemoryPermission permission) {
 | 
			
		||||
        page_table->SetProcessMemoryPermission(segment.addr + base_addr, segment.size, permission);
 | 
			
		||||
 
 | 
			
		||||
@@ -41,7 +41,6 @@
 | 
			
		||||
#include "core/hle/kernel/svc_results.h"
 | 
			
		||||
#include "core/hle/kernel/svc_types.h"
 | 
			
		||||
#include "core/hle/kernel/svc_wrap.h"
 | 
			
		||||
#include "core/hle/lock.h"
 | 
			
		||||
#include "core/hle/result.h"
 | 
			
		||||
#include "core/memory.h"
 | 
			
		||||
#include "core/reporter.h"
 | 
			
		||||
@@ -137,7 +136,6 @@ enum class ResourceLimitValueType {
 | 
			
		||||
 | 
			
		||||
/// Set the process heap to a given Size. It can both extend and shrink the heap.
 | 
			
		||||
static ResultCode SetHeapSize(Core::System& system, VAddr* heap_addr, u64 heap_size) {
 | 
			
		||||
    std::lock_guard lock{HLE::g_hle_lock};
 | 
			
		||||
    LOG_TRACE(Kernel_SVC, "called, heap_size=0x{:X}", heap_size);
 | 
			
		||||
 | 
			
		||||
    // Size must be a multiple of 0x200000 (2MB) and be equal to or less than 8GB.
 | 
			
		||||
@@ -168,7 +166,6 @@ static ResultCode SetHeapSize32(Core::System& system, u32* heap_addr, u32 heap_s
 | 
			
		||||
 | 
			
		||||
static ResultCode SetMemoryAttribute(Core::System& system, VAddr address, u64 size, u32 mask,
 | 
			
		||||
                                     u32 attribute) {
 | 
			
		||||
    std::lock_guard lock{HLE::g_hle_lock};
 | 
			
		||||
    LOG_DEBUG(Kernel_SVC,
 | 
			
		||||
              "called, address=0x{:016X}, size=0x{:X}, mask=0x{:08X}, attribute=0x{:08X}", address,
 | 
			
		||||
              size, mask, attribute);
 | 
			
		||||
@@ -212,7 +209,6 @@ static ResultCode SetMemoryAttribute32(Core::System& system, u32 address, u32 si
 | 
			
		||||
 | 
			
		||||
/// Maps a memory range into a different range.
 | 
			
		||||
static ResultCode MapMemory(Core::System& system, VAddr dst_addr, VAddr src_addr, u64 size) {
 | 
			
		||||
    std::lock_guard lock{HLE::g_hle_lock};
 | 
			
		||||
    LOG_TRACE(Kernel_SVC, "called, dst_addr=0x{:X}, src_addr=0x{:X}, size=0x{:X}", dst_addr,
 | 
			
		||||
              src_addr, size);
 | 
			
		||||
 | 
			
		||||
@@ -232,7 +228,6 @@ static ResultCode MapMemory32(Core::System& system, u32 dst_addr, u32 src_addr,
 | 
			
		||||
 | 
			
		||||
/// Unmaps a region that was previously mapped with svcMapMemory
 | 
			
		||||
static ResultCode UnmapMemory(Core::System& system, VAddr dst_addr, VAddr src_addr, u64 size) {
 | 
			
		||||
    std::lock_guard lock{HLE::g_hle_lock};
 | 
			
		||||
    LOG_TRACE(Kernel_SVC, "called, dst_addr=0x{:X}, src_addr=0x{:X}, size=0x{:X}", dst_addr,
 | 
			
		||||
              src_addr, size);
 | 
			
		||||
 | 
			
		||||
@@ -642,7 +637,6 @@ static void OutputDebugString(Core::System& system, VAddr address, u64 len) {
 | 
			
		||||
/// Gets system/memory information for the current process
 | 
			
		||||
static ResultCode GetInfo(Core::System& system, u64* result, u64 info_id, Handle handle,
 | 
			
		||||
                          u64 info_sub_id) {
 | 
			
		||||
    std::lock_guard lock{HLE::g_hle_lock};
 | 
			
		||||
    LOG_TRACE(Kernel_SVC, "called info_id=0x{:X}, info_sub_id=0x{:X}, handle=0x{:08X}", info_id,
 | 
			
		||||
              info_sub_id, handle);
 | 
			
		||||
 | 
			
		||||
@@ -924,7 +918,6 @@ static ResultCode GetInfo32(Core::System& system, u32* result_low, u32* result_h
 | 
			
		||||
 | 
			
		||||
/// Maps memory at a desired address
 | 
			
		||||
static ResultCode MapPhysicalMemory(Core::System& system, VAddr addr, u64 size) {
 | 
			
		||||
    std::lock_guard lock{HLE::g_hle_lock};
 | 
			
		||||
    LOG_DEBUG(Kernel_SVC, "called, addr=0x{:016X}, size=0x{:X}", addr, size);
 | 
			
		||||
 | 
			
		||||
    if (!Common::Is4KBAligned(addr)) {
 | 
			
		||||
@@ -978,7 +971,6 @@ static ResultCode MapPhysicalMemory32(Core::System& system, u32 addr, u32 size)
 | 
			
		||||
 | 
			
		||||
/// Unmaps memory previously mapped via MapPhysicalMemory
 | 
			
		||||
static ResultCode UnmapPhysicalMemory(Core::System& system, VAddr addr, u64 size) {
 | 
			
		||||
    std::lock_guard lock{HLE::g_hle_lock};
 | 
			
		||||
    LOG_DEBUG(Kernel_SVC, "called, addr=0x{:016X}, size=0x{:X}", addr, size);
 | 
			
		||||
 | 
			
		||||
    if (!Common::Is4KBAligned(addr)) {
 | 
			
		||||
@@ -1520,7 +1512,6 @@ static ResultCode ControlCodeMemory(Core::System& system, Handle code_memory_han
 | 
			
		||||
static ResultCode QueryProcessMemory(Core::System& system, VAddr memory_info_address,
 | 
			
		||||
                                     VAddr page_info_address, Handle process_handle,
 | 
			
		||||
                                     VAddr address) {
 | 
			
		||||
    std::lock_guard lock{HLE::g_hle_lock};
 | 
			
		||||
    LOG_TRACE(Kernel_SVC, "called process=0x{:08X} address={:X}", process_handle, address);
 | 
			
		||||
    const auto& handle_table = system.Kernel().CurrentProcess()->GetHandleTable();
 | 
			
		||||
    KScopedAutoObject process = handle_table.GetObject<KProcess>(process_handle);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +0,0 @@
 | 
			
		||||
// Copyright 2017 Citra Emulator Project
 | 
			
		||||
// Licensed under GPLv2 or any later version
 | 
			
		||||
// Refer to the license.txt file included.
 | 
			
		||||
 | 
			
		||||
#include <core/hle/lock.h>
 | 
			
		||||
 | 
			
		||||
namespace HLE {
 | 
			
		||||
std::recursive_mutex g_hle_lock;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,18 +0,0 @@
 | 
			
		||||
// Copyright 2017 Citra Emulator Project
 | 
			
		||||
// Licensed under GPLv2 or any later version
 | 
			
		||||
// Refer to the license.txt file included.
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <mutex>
 | 
			
		||||
 | 
			
		||||
namespace HLE {
 | 
			
		||||
/*
 | 
			
		||||
 * Synchronizes access to the internal HLE kernel structures, it is acquired when a guest
 | 
			
		||||
 * application thread performs a syscall. It should be acquired by any host threads that read or
 | 
			
		||||
 * modify the HLE kernel state. Note: Any operation that directly or indirectly reads from or writes
 | 
			
		||||
 * to the emulated memory is not protected by this mutex, and should be avoided in any threads other
 | 
			
		||||
 * than the CPU thread.
 | 
			
		||||
 */
 | 
			
		||||
extern std::recursive_mutex g_hle_lock;
 | 
			
		||||
} // namespace HLE
 | 
			
		||||
@@ -6,7 +6,6 @@
 | 
			
		||||
#include "common/logging/log.h"
 | 
			
		||||
#include "core/core.h"
 | 
			
		||||
#include "core/hle/kernel/k_event.h"
 | 
			
		||||
#include "core/hle/lock.h"
 | 
			
		||||
#include "core/hle/service/bcat/backend/backend.h"
 | 
			
		||||
 | 
			
		||||
namespace Service::BCAT {
 | 
			
		||||
@@ -29,10 +28,6 @@ DeliveryCacheProgressImpl& ProgressServiceBackend::GetImpl() {
 | 
			
		||||
    return impl;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ProgressServiceBackend::SetNeedHLELock(bool need) {
 | 
			
		||||
    need_hle_lock = need;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ProgressServiceBackend::SetTotalSize(u64 size) {
 | 
			
		||||
    impl.total_bytes = size;
 | 
			
		||||
    SignalUpdate();
 | 
			
		||||
@@ -88,12 +83,7 @@ void ProgressServiceBackend::FinishDownload(ResultCode result) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ProgressServiceBackend::SignalUpdate() {
 | 
			
		||||
    if (need_hle_lock) {
 | 
			
		||||
        std::lock_guard lock(HLE::g_hle_lock);
 | 
			
		||||
        update_event->GetWritableEvent().Signal();
 | 
			
		||||
    } else {
 | 
			
		||||
        update_event->GetWritableEvent().Signal();
 | 
			
		||||
    }
 | 
			
		||||
    update_event->GetWritableEvent().Signal();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Backend::Backend(DirectoryGetter getter) : dir_getter(std::move(getter)) {}
 | 
			
		||||
 
 | 
			
		||||
@@ -71,10 +71,6 @@ class ProgressServiceBackend {
 | 
			
		||||
public:
 | 
			
		||||
    ~ProgressServiceBackend();
 | 
			
		||||
 | 
			
		||||
    // Clients should call this with true if any of the functions are going to be called from a
 | 
			
		||||
    // non-HLE thread and this class need to lock the hle mutex. (default is false)
 | 
			
		||||
    void SetNeedHLELock(bool need);
 | 
			
		||||
 | 
			
		||||
    // Sets the number of bytes total in the entire download.
 | 
			
		||||
    void SetTotalSize(u64 size);
 | 
			
		||||
 | 
			
		||||
@@ -109,7 +105,6 @@ private:
 | 
			
		||||
 | 
			
		||||
    DeliveryCacheProgressImpl impl{};
 | 
			
		||||
    Kernel::KEvent* update_event;
 | 
			
		||||
    bool need_hle_lock = false;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// A class representing an abstract backend for BCAT functionality.
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,6 @@
 | 
			
		||||
#include "core/core.h"
 | 
			
		||||
#include "core/hle/ipc_helpers.h"
 | 
			
		||||
#include "core/hle/kernel/k_event.h"
 | 
			
		||||
#include "core/hle/lock.h"
 | 
			
		||||
#include "core/hle/service/nfp/nfp.h"
 | 
			
		||||
#include "core/hle/service/nfp/nfp_user.h"
 | 
			
		||||
 | 
			
		||||
@@ -337,7 +336,6 @@ void Module::Interface::CreateUserInterface(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool Module::Interface::LoadAmiibo(const std::vector<u8>& buffer) {
 | 
			
		||||
    std::lock_guard lock{HLE::g_hle_lock};
 | 
			
		||||
    if (buffer.size() < sizeof(AmiiboFile)) {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,6 @@
 | 
			
		||||
#include "core/hid/emulated_controller.h"
 | 
			
		||||
#include "core/hid/hid_core.h"
 | 
			
		||||
#include "core/hid/hid_types.h"
 | 
			
		||||
#include "core/hle/lock.h"
 | 
			
		||||
#include "core/hle/service/hid/controllers/npad.h"
 | 
			
		||||
#include "core/hle/service/hid/hid.h"
 | 
			
		||||
#include "core/hle/service/sm/sm.h"
 | 
			
		||||
@@ -664,7 +663,5 @@ void QtControllerSelector::ReconfigureControllers(
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void QtControllerSelector::MainWindowReconfigureFinished() {
 | 
			
		||||
    // Acquire the HLE mutex
 | 
			
		||||
    std::lock_guard lock(HLE::g_hle_lock);
 | 
			
		||||
    callback();
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,6 @@
 | 
			
		||||
// Refer to the license.txt file included.
 | 
			
		||||
 | 
			
		||||
#include <QDateTime>
 | 
			
		||||
#include "core/hle/lock.h"
 | 
			
		||||
#include "yuzu/applets/qt_error.h"
 | 
			
		||||
#include "yuzu/main.h"
 | 
			
		||||
 | 
			
		||||
@@ -57,7 +56,5 @@ void QtErrorDisplay::ShowCustomErrorText(ResultCode error, std::string dialog_te
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void QtErrorDisplay::MainWindowFinishedError() {
 | 
			
		||||
    // Acquire the HLE mutex
 | 
			
		||||
    std::lock_guard lock{HLE::g_hle_lock};
 | 
			
		||||
    callback();
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,6 @@
 | 
			
		||||
#include "common/fs/path_util.h"
 | 
			
		||||
#include "common/string_util.h"
 | 
			
		||||
#include "core/constants.h"
 | 
			
		||||
#include "core/hle/lock.h"
 | 
			
		||||
#include "yuzu/applets/qt_profile_select.h"
 | 
			
		||||
#include "yuzu/main.h"
 | 
			
		||||
#include "yuzu/util/controller_navigation.h"
 | 
			
		||||
@@ -170,7 +169,5 @@ void QtProfileSelector::SelectProfile(
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void QtProfileSelector::MainWindowFinishedSelection(std::optional<Common::UUID> uuid) {
 | 
			
		||||
    // Acquire the HLE mutex
 | 
			
		||||
    std::lock_guard lock{HLE::g_hle_lock};
 | 
			
		||||
    callback(uuid);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user