Skip to content
Snippets Groups Projects
Commit e917ab25 authored by Avi Kivity's avatar Avi Kivity
Browse files

mempool: use a mutex instead of a spinlock

Mutexes are now allocation free and thus safe for use within the allocator.
parent cbec141a
No related branches found
No related tags found
No related merge requests found
......@@ -56,7 +56,7 @@ pool::page_header* pool::to_header(free_object* object)
void* pool::alloc()
{
std::lock_guard<spinlock> guard(_lock);
std::lock_guard<mutex> guard(_lock);
if (_free.empty()) {
add_page();
}
......@@ -92,7 +92,7 @@ void pool::add_page()
void pool::free(void* object)
{
std::lock_guard<spinlock> guard(_lock);
std::lock_guard<mutex> guard(_lock);
auto obj = static_cast<free_object*>(object);
auto header = to_header(obj);
if (!--header->nalloc) {
......@@ -146,7 +146,7 @@ struct addr_cmp {
namespace bi = boost::intrusive;
spinlock free_page_ranges_lock;
mutex free_page_ranges_lock;
bi::set<page_range,
bi::compare<addr_cmp>,
bi::member_hook<page_range,
......@@ -159,7 +159,7 @@ void* malloc_large(size_t size)
size = (size + page_size - 1) & ~(page_size - 1);
size += page_size;
std::lock_guard<spinlock> guard(free_page_ranges_lock);
std::lock_guard<mutex> guard(free_page_ranges_lock);
for (auto i = free_page_ranges.begin(); i != free_page_ranges.end(); ++i) {
auto header = &*i;
......@@ -200,7 +200,7 @@ void free_large(void* obj)
obj -= page_size;
auto header = static_cast<page_range*>(obj);
std::lock_guard<spinlock> guard(free_page_ranges_lock);
std::lock_guard<mutex> guard(free_page_ranges_lock);
auto i = free_page_ranges.insert(*header).first;
if (i != free_page_ranges.begin()) {
......@@ -220,7 +220,7 @@ unsigned large_object_size(void *obj)
void* alloc_page()
{
std::lock_guard<spinlock> guard(free_page_ranges_lock);
std::lock_guard<mutex> guard(free_page_ranges_lock);
assert(!free_page_ranges.empty());
auto p = &*free_page_ranges.begin();
......
......@@ -37,7 +37,7 @@ private:
void add_page();
static page_header* to_header(free_object* object);
private:
spinlock _lock;
mutex _lock;
unsigned _size;
struct page_header {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment