device_memory_manager: use unique_lock for update
This commit is contained in:
		@@ -509,18 +509,12 @@ void DeviceMemoryManager<Traits>::UnregisterProcess(Asid asid) {
 | 
			
		||||
 | 
			
		||||
template <typename Traits>
 | 
			
		||||
void DeviceMemoryManager<Traits>::UpdatePagesCachedCount(DAddr addr, size_t size, s32 delta) {
 | 
			
		||||
    bool locked = false;
 | 
			
		||||
    auto lock = [&] {
 | 
			
		||||
        if (!locked) {
 | 
			
		||||
            counter_guard.lock();
 | 
			
		||||
            locked = true;
 | 
			
		||||
    std::unique_lock<std::mutex> lk(counter_guard, std::defer_lock);
 | 
			
		||||
    const auto Lock = [&] {
 | 
			
		||||
        if (!lk) {
 | 
			
		||||
            lk.lock();
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    SCOPE_EXIT({
 | 
			
		||||
        if (locked) {
 | 
			
		||||
            counter_guard.unlock();
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
    u64 uncache_begin = 0;
 | 
			
		||||
    u64 cache_begin = 0;
 | 
			
		||||
    u64 uncache_bytes = 0;
 | 
			
		||||
@@ -555,7 +549,7 @@ void DeviceMemoryManager<Traits>::UpdatePagesCachedCount(DAddr addr, size_t size
 | 
			
		||||
            }
 | 
			
		||||
            uncache_bytes += Memory::YUZU_PAGESIZE;
 | 
			
		||||
        } else if (uncache_bytes > 0) {
 | 
			
		||||
            lock();
 | 
			
		||||
            Lock();
 | 
			
		||||
            MarkRegionCaching(memory_device_inter, uncache_begin << Memory::YUZU_PAGEBITS,
 | 
			
		||||
                              uncache_bytes, false);
 | 
			
		||||
            uncache_bytes = 0;
 | 
			
		||||
@@ -566,7 +560,7 @@ void DeviceMemoryManager<Traits>::UpdatePagesCachedCount(DAddr addr, size_t size
 | 
			
		||||
            }
 | 
			
		||||
            cache_bytes += Memory::YUZU_PAGESIZE;
 | 
			
		||||
        } else if (cache_bytes > 0) {
 | 
			
		||||
            lock();
 | 
			
		||||
            Lock();
 | 
			
		||||
            MarkRegionCaching(memory_device_inter, cache_begin << Memory::YUZU_PAGEBITS, cache_bytes,
 | 
			
		||||
                              true);
 | 
			
		||||
            cache_bytes = 0;
 | 
			
		||||
@@ -574,12 +568,12 @@ void DeviceMemoryManager<Traits>::UpdatePagesCachedCount(DAddr addr, size_t size
 | 
			
		||||
        vpage++;
 | 
			
		||||
    }
 | 
			
		||||
    if (uncache_bytes > 0) {
 | 
			
		||||
        lock();
 | 
			
		||||
        Lock();
 | 
			
		||||
        MarkRegionCaching(memory_device_inter, uncache_begin << Memory::YUZU_PAGEBITS, uncache_bytes,
 | 
			
		||||
                          false);
 | 
			
		||||
    }
 | 
			
		||||
    if (cache_bytes > 0) {
 | 
			
		||||
        lock();
 | 
			
		||||
        Lock();
 | 
			
		||||
        MarkRegionCaching(memory_device_inter, cache_begin << Memory::YUZU_PAGEBITS, cache_bytes,
 | 
			
		||||
                          true);
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user