Fix shared locking

This commit is contained in:
Lander Gallastegi 2025-07-07 21:37:43 +02:00
parent 35bbe874a9
commit 5d2598c505

View file

@ -150,9 +150,7 @@ private:
template <bool create_region_on_fail, bool locking, typename Func> template <bool create_region_on_fail, bool locking, typename Func>
bool IterateRegions(VAddr cpu_address, size_t size, Func&& func) { bool IterateRegions(VAddr cpu_address, size_t size, Func&& func) {
RENDERER_TRACE; RENDERER_TRACE;
if constexpr (locking) { const auto run = [&]() {
std::shared_lock lock{global_lock};
}
using FuncReturn = typename std::invoke_result<Func, RegionManager*, u64, size_t>::type; using FuncReturn = typename std::invoke_result<Func, RegionManager*, u64, size_t>::type;
static constexpr bool BOOL_BREAK = std::is_same_v<FuncReturn, bool>; static constexpr bool BOOL_BREAK = std::is_same_v<FuncReturn, bool>;
std::size_t remaining_size{size}; std::size_t remaining_size{size};
@ -186,6 +184,13 @@ private:
remaining_size -= copy_amount; remaining_size -= copy_amount;
} }
return false; return false;
};
if constexpr (locking) {
std::shared_lock lock{global_lock};
return run();
} else {
return run();
}
} }
/** /**
@ -196,9 +201,7 @@ private:
template <bool locking, typename Func> template <bool locking, typename Func>
void ForEachRegion(Func&& func) { void ForEachRegion(Func&& func) {
RENDERER_TRACE; RENDERER_TRACE;
if constexpr (locking) { const auto run = [&]() {
std::shared_lock lock{global_lock};
}
for (auto& pool : manager_pool) { for (auto& pool : manager_pool) {
for (auto& manager : pool) { for (auto& manager : pool) {
if (manager.GetCpuAddr() != 0) { if (manager.GetCpuAddr() != 0) {
@ -206,6 +209,13 @@ private:
} }
} }
} }
};
if constexpr (locking) {
std::shared_lock lock{global_lock};
run();
} else {
run();
}
} }
void CreateRegion(std::size_t page_index) { void CreateRegion(std::size_t page_index) {