diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/device_memory_manager.inc | 22 |
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 | ||
| 510 | template <typename Traits> | 510 | template <typename Traits> |
| 511 | void DeviceMemoryManager<Traits>::UpdatePagesCachedCount(DAddr addr, size_t size, s32 delta) { | 511 | void 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 | } |