[kernel] Ensure all kernel objects exist before destroying them and avoid infinite loop between Open() and Close() functions (#261)
This ensures that all kernel objects exist before destroying them and prevents an infinite loop between the Open() and Close() functions. Reviewed-on: #261 Reviewed-by: Shinmegumi <shinmegumi@eden-emu.dev> Co-authored-by: MaranBr <maranbr@outlook.com> Co-committed-by: MaranBr <maranbr@outlook.com>
This commit is contained in:
parent
e807e32b1a
commit
b906abf9fc
1 changed files with 10 additions and 4 deletions
|
@ -1,5 +1,8 @@
|
|||
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
|
@ -153,12 +156,15 @@ public:
|
|||
// Atomically decrement the reference count, not allowing it to become negative.
|
||||
u32 cur_ref_count = m_ref_count.load(std::memory_order_acquire);
|
||||
do {
|
||||
if (cur_ref_count == 0) {
|
||||
return;
|
||||
}
|
||||
ASSERT(cur_ref_count > 0);
|
||||
} while (!m_ref_count.compare_exchange_weak(cur_ref_count, cur_ref_count - 1,
|
||||
std::memory_order_acq_rel));
|
||||
|
||||
// If ref count hits zero, destroy the object.
|
||||
if (cur_ref_count - 1 == 0) {
|
||||
// If ref count hits 1, destroy the object.
|
||||
if (cur_ref_count == 1) {
|
||||
KernelCore& kernel = m_kernel;
|
||||
this->Destroy();
|
||||
KAutoObject::UnregisterWithKernel(kernel, this);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue