summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/device_memory_manager.inc22
1 files changed, 8 insertions, 14 deletions
diff --git a/src/core/device_memory_manager.inc b/src/core/device_memory_manager.inc
index f6e4ad874..8ce122872 100644
--- a/src/core/device_memory_manager.inc
+++ b/src/core/device_memory_manager.inc
@@ -509,18 +509,12 @@ void DeviceMemoryManager<Traits>::UnregisterProcess(Asid asid) {
509 509
510template <typename Traits> 510template <typename Traits>
511void DeviceMemoryManager<Traits>::UpdatePagesCachedCount(DAddr addr, size_t size, s32 delta) { 511void DeviceMemoryManager<Traits>::UpdatePagesCachedCount(DAddr addr, size_t size, s32 delta) {
512 bool locked = false; 512 std::unique_lock<std::mutex> lk(counter_guard, std::defer_lock);
513 auto lock = [&] { 513 const auto Lock = [&] {
514 if (!locked) { 514 if (!lk) {
515 counter_guard.lock(); 515 lk.lock();
516 locked = true;
517 } 516 }
518 }; 517 };
519 SCOPE_EXIT({
520 if (locked) {
521 counter_guard.unlock();
522 }
523 });
524 u64 uncache_begin = 0; 518 u64 uncache_begin = 0;
525 u64 cache_begin = 0; 519 u64 cache_begin = 0;
526 u64 uncache_bytes = 0; 520 u64 uncache_bytes = 0;
@@ -555,7 +549,7 @@ void DeviceMemoryManager<Traits>::UpdatePagesCachedCount(DAddr addr, size_t size
555 } 549 }
556 uncache_bytes += Memory::YUZU_PAGESIZE; 550 uncache_bytes += Memory::YUZU_PAGESIZE;
557 } else if (uncache_bytes > 0) { 551 } else if (uncache_bytes > 0) {
558 lock(); 552 Lock();
559 MarkRegionCaching(memory_device_inter, uncache_begin << Memory::YUZU_PAGEBITS, 553 MarkRegionCaching(memory_device_inter, uncache_begin << Memory::YUZU_PAGEBITS,
560 uncache_bytes, false); 554 uncache_bytes, false);
561 uncache_bytes = 0; 555 uncache_bytes = 0;
@@ -566,7 +560,7 @@ void DeviceMemoryManager<Traits>::UpdatePagesCachedCount(DAddr addr, size_t size
566 } 560 }
567 cache_bytes += Memory::YUZU_PAGESIZE; 561 cache_bytes += Memory::YUZU_PAGESIZE;
568 } else if (cache_bytes > 0) { 562 } else if (cache_bytes > 0) {
569 lock(); 563 Lock();
570 MarkRegionCaching(memory_device_inter, cache_begin << Memory::YUZU_PAGEBITS, cache_bytes, 564 MarkRegionCaching(memory_device_inter, cache_begin << Memory::YUZU_PAGEBITS, cache_bytes,
571 true); 565 true);
572 cache_bytes = 0; 566 cache_bytes = 0;
@@ -574,12 +568,12 @@ void DeviceMemoryManager<Traits>::UpdatePagesCachedCount(DAddr addr, size_t size
574 vpage++; 568 vpage++;
575 } 569 }
576 if (uncache_bytes > 0) { 570 if (uncache_bytes > 0) {
577 lock(); 571 Lock();
578 MarkRegionCaching(memory_device_inter, uncache_begin << Memory::YUZU_PAGEBITS, uncache_bytes, 572 MarkRegionCaching(memory_device_inter, uncache_begin << Memory::YUZU_PAGEBITS, uncache_bytes,
579 false); 573 false);
580 } 574 }
581 if (cache_bytes > 0) { 575 if (cache_bytes > 0) {
582 lock(); 576 Lock();
583 MarkRegionCaching(memory_device_inter, cache_begin << Memory::YUZU_PAGEBITS, cache_bytes, 577 MarkRegionCaching(memory_device_inter, cache_begin << Memory::YUZU_PAGEBITS, cache_bytes,
584 true); 578 true);
585 } 579 }