Ensure all kernel objects exist before destroying them and avoid infinite loop between Open() and Close() functions.
This commit is contained in:
parent
e807e32b1a
commit
160cdda902
1 changed files with 5 additions and 2 deletions
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue