I despite you clang

This commit is contained in:
CamilleLaVey
2026-07-18 16:51:03 -04:00
parent 787f80e05c
commit dfb2fa717e
@@ -58,8 +58,7 @@ public:
while (remaining_size > 0) { while (remaining_size > 0) {
const std::size_t copy_amount{ const std::size_t copy_amount{
std::min<std::size_t>(HIGHER_PAGE_SIZE - page_offset, remaining_size)}; std::min<std::size_t>(HIGHER_PAGE_SIZE - page_offset, remaining_size)};
const Manager* manager = const Manager* manager = top_tier[page_index].load(std::memory_order_acquire);
std::atomic_ref<Manager*>(top_tier[page_index]).load(std::memory_order_acquire);
if (manager == nullptr || manager->CpuModifiedPageCount() != 0) { if (manager == nullptr || manager->CpuModifiedPageCount() != 0) {
return true; return true;
} }
@@ -153,7 +152,7 @@ public:
void FlushCachedWrites() noexcept { void FlushCachedWrites() noexcept {
std::scoped_lock lk{tracker_mutex}; std::scoped_lock lk{tracker_mutex};
for (auto id : cached_pages) { for (auto id : cached_pages) {
top_tier[id]->FlushCachedWrites(); top_tier[id].load(std::memory_order_relaxed)->FlushCachedWrites();
} }
cached_pages.clear(); cached_pages.clear();
} }
@@ -213,7 +212,7 @@ private:
while (remaining_size > 0) { while (remaining_size > 0) {
const std::size_t copy_amount{ const std::size_t copy_amount{
std::min<std::size_t>(HIGHER_PAGE_SIZE - page_offset, remaining_size)}; std::min<std::size_t>(HIGHER_PAGE_SIZE - page_offset, remaining_size)};
auto* manager{top_tier[page_index]}; auto* manager{top_tier[page_index].load(std::memory_order_relaxed)};
if (manager) { if (manager) {
if constexpr (BOOL_BREAK) { if constexpr (BOOL_BREAK) {
if (func(manager, page_offset, copy_amount)) { if (func(manager, page_offset, copy_amount)) {
@@ -224,7 +223,7 @@ private:
} }
} else if constexpr (create_region_on_fail) { } else if constexpr (create_region_on_fail) {
CreateRegion(page_index); CreateRegion(page_index);
manager = top_tier[page_index]; manager = top_tier[page_index].load(std::memory_order_relaxed);
if constexpr (BOOL_BREAK) { if constexpr (BOOL_BREAK) {
if (func(manager, page_offset, copy_amount)) { if (func(manager, page_offset, copy_amount)) {
return true; return true;
@@ -251,7 +250,7 @@ private:
while (remaining_size > 0) { while (remaining_size > 0) {
const std::size_t copy_amount{ const std::size_t copy_amount{
std::min<std::size_t>(HIGHER_PAGE_SIZE - page_offset, remaining_size)}; std::min<std::size_t>(HIGHER_PAGE_SIZE - page_offset, remaining_size)};
auto* manager{top_tier[page_index]}; auto* manager{top_tier[page_index].load(std::memory_order_relaxed)};
const auto execute = [&] { const auto execute = [&] {
auto [new_begin, new_end] = func(manager, page_offset, copy_amount); auto [new_begin, new_end] = func(manager, page_offset, copy_amount);
if (new_begin != 0 || new_end != 0) { if (new_begin != 0 || new_end != 0) {
@@ -264,7 +263,7 @@ private:
execute(); execute();
} else if constexpr (create_region_on_fail) { } else if constexpr (create_region_on_fail) {
CreateRegion(page_index); CreateRegion(page_index);
manager = top_tier[page_index]; manager = top_tier[page_index].load(std::memory_order_relaxed);
execute(); execute();
} }
page_index++; page_index++;
@@ -280,8 +279,7 @@ private:
void CreateRegion(std::size_t page_index) { void CreateRegion(std::size_t page_index) {
const VAddr base_cpu_addr = page_index << HIGHER_PAGE_BITS; const VAddr base_cpu_addr = page_index << HIGHER_PAGE_BITS;
std::atomic_ref<Manager*>(top_tier[page_index]) top_tier[page_index].store(GetNewManager(base_cpu_addr), std::memory_order_release);
.store(GetNewManager(base_cpu_addr), std::memory_order_release);
} }
Manager* GetNewManager(VAddr base_cpu_address) { Manager* GetNewManager(VAddr base_cpu_address) {
@@ -299,7 +297,7 @@ private:
return new_manager; return new_manager;
} }
std::array<Manager*, NUM_HIGH_PAGES> top_tier{}; std::array<std::atomic<Manager*>, NUM_HIGH_PAGES> top_tier{};
std::deque<std::array<Manager, MANAGER_POOL_SIZE>> manager_pool; std::deque<std::array<Manager, MANAGER_POOL_SIZE>> manager_pool;
std::deque<Manager*> free_managers; std::deque<Manager*> free_managers;
ankerl::unordered_dense::set<u32> cached_pages; ankerl::unordered_dense::set<u32> cached_pages;