mirror of
https://github.com/justinian/jsix.git
synced 2025-12-10 08:24:32 -08:00
[kutil] Protect heap allocation with a spinlock
Don't allow multiple cores to access the heap datastructures at once.
This commit is contained in:
@@ -89,6 +89,8 @@ heap_allocator::allocate(size_t length)
|
|||||||
if (order > max_order)
|
if (order > max_order)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
|
scoped_lock lock {m_lock};
|
||||||
|
|
||||||
mem_header *header = pop_free(order);
|
mem_header *header = pop_free(order);
|
||||||
header->set_used(true);
|
header->set_used(true);
|
||||||
m_allocated_size += (1 << order);
|
m_allocated_size += (1 << order);
|
||||||
@@ -104,6 +106,8 @@ heap_allocator::free(void *p)
|
|||||||
kassert(addr >= m_start && addr < m_end,
|
kassert(addr >= m_start && addr < m_end,
|
||||||
"Attempt to free non-heap pointer");
|
"Attempt to free non-heap pointer");
|
||||||
|
|
||||||
|
scoped_lock lock {m_lock};
|
||||||
|
|
||||||
mem_header *header = reinterpret_cast<mem_header *>(p);
|
mem_header *header = reinterpret_cast<mem_header *>(p);
|
||||||
header -= 1; // p points after the header
|
header -= 1; // p points after the header
|
||||||
header->set_used(false);
|
header->set_used(false);
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
/// A buddy allocator for a memory heap
|
/// A buddy allocator for a memory heap
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
#include "kutil/spinlock.h"
|
||||||
|
|
||||||
namespace kutil {
|
namespace kutil {
|
||||||
|
|
||||||
@@ -57,6 +58,8 @@ protected:
|
|||||||
mem_header *m_free[max_order - min_order + 1];
|
mem_header *m_free[max_order - min_order + 1];
|
||||||
size_t m_allocated_size;
|
size_t m_allocated_size;
|
||||||
|
|
||||||
|
spinlock m_lock;
|
||||||
|
|
||||||
heap_allocator(const heap_allocator &) = delete;
|
heap_allocator(const heap_allocator &) = delete;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user