diff options
author | liamwhite <liamwhite@users.noreply.github.com> | 2022-10-19 22:27:59 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-19 22:27:59 +0200 |
commit | 925fb63478ab39224711d8938294e9671d6585fc (patch) | |
tree | 98d58fab746366c70e89b1c35119df18aa315244 | |
parent | Merge pull request #9071 from bunnei/mp-mm (diff) | |
parent | kernel: fix slab heap ABA (diff) | |
download | yuzu-925fb63478ab39224711d8938294e9671d6585fc.tar yuzu-925fb63478ab39224711d8938294e9671d6585fc.tar.gz yuzu-925fb63478ab39224711d8938294e9671d6585fc.tar.bz2 yuzu-925fb63478ab39224711d8938294e9671d6585fc.tar.lz yuzu-925fb63478ab39224711d8938294e9671d6585fc.tar.xz yuzu-925fb63478ab39224711d8938294e9671d6585fc.tar.zst yuzu-925fb63478ab39224711d8938294e9671d6585fc.zip |
-rw-r--r-- | src/core/hle/kernel/k_slab_heap.h | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/src/core/hle/kernel/k_slab_heap.h b/src/core/hle/kernel/k_slab_heap.h index 2b303537e..a8c77a7d4 100644 --- a/src/core/hle/kernel/k_slab_heap.h +++ b/src/core/hle/kernel/k_slab_heap.h @@ -8,6 +8,7 @@ #include "common/assert.h" #include "common/common_funcs.h" #include "common/common_types.h" +#include "common/spin_lock.h" namespace Kernel { @@ -36,28 +37,34 @@ public: } void* Allocate() { - Node* ret = m_head.load(); + // KScopedInterruptDisable di; - do { - if (ret == nullptr) { - break; - } - } while (!m_head.compare_exchange_weak(ret, ret->next)); + m_lock.lock(); + + Node* ret = m_head; + if (ret != nullptr) [[likely]] { + m_head = ret->next; + } + m_lock.unlock(); return ret; } void Free(void* obj) { + // KScopedInterruptDisable di; + + m_lock.lock(); + Node* node = static_cast<Node*>(obj); + node->next = m_head; + m_head = node; - Node* cur_head = m_head.load(); - do { - node->next = cur_head; - } while (!m_head.compare_exchange_weak(cur_head, node)); + m_lock.unlock(); } private: std::atomic<Node*> m_head{}; + Common::SpinLock m_lock; }; } // namespace impl |