If the heap code dumps a stack trace (e.g. out of memory) then it may recursively call into it. Rather than deadlocking, allow recursion.
@@ -67,7 +67,7 @@ bool g_dump_kmalloc_stacks;
static u8* s_next_eternal_ptr;
static u8* s_end_of_eternal_range;
-static SpinLock s_lock;
+static RecursiveSpinLock s_lock; // needs to be recursive because of dump_backtrace()
void kmalloc_init()
{
@@ -103,6 +103,11 @@ public:
return m_lock.load(AK::memory_order_consume) != 0;
}
+
+ ALWAYS_INLINE void initialize()
+ {
+ m_lock.store(0, AK::memory_order_release);
+ }
};
template <typename BaseType = u32, typename LockType = SpinLock<BaseType>>