Ensure all kernel objects exist before destroying them and avoid infinite loop between Open() and Close() functions.

This commit is contained in:
MaranBr 2025-08-14 13:10:15 -04:00 committed by crueter
parent e807e32b1a
commit 160cdda902

View file

@ -153,12 +153,15 @@ public:
// Atomically decrement the reference count, not allowing it to become negative. // Atomically decrement the reference count, not allowing it to become negative.
u32 cur_ref_count = m_ref_count.load(std::memory_order_acquire); u32 cur_ref_count = m_ref_count.load(std::memory_order_acquire);
do { do {
if (cur_ref_count == 0) {
return;
}
ASSERT(cur_ref_count > 0); ASSERT(cur_ref_count > 0);
} while (!m_ref_count.compare_exchange_weak(cur_ref_count, cur_ref_count - 1, } while (!m_ref_count.compare_exchange_weak(cur_ref_count, cur_ref_count - 1,
std::memory_order_acq_rel)); std::memory_order_acq_rel));
// If ref count hits zero, destroy the object. // If ref count hits 1, destroy the object.
if (cur_ref_count - 1 == 0) { if (cur_ref_count == 1) {
KernelCore& kernel = m_kernel; KernelCore& kernel = m_kernel;
this->Destroy(); this->Destroy();
KAutoObject::UnregisterWithKernel(kernel, this); KAutoObject::UnregisterWithKernel(kernel, this);