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) ...@@ -56,7 +56,7 @@ pool::page_header* pool::to_header(free_object* object)
void* pool::alloc() void* pool::alloc()
{ {
std::lock_guard<spinlock> guard(_lock); std::lock_guard<mutex> guard(_lock);
if (_free.empty()) { if (_free.empty()) {
add_page(); add_page();
} }
...@@ -92,7 +92,7 @@ void pool::add_page() ...@@ -92,7 +92,7 @@ void pool::add_page()
void pool::free(void* object) 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 obj = static_cast<free_object*>(object);
auto header = to_header(obj); auto header = to_header(obj);
if (!--header->nalloc) { if (!--header->nalloc) {
...@@ -146,7 +146,7 @@ struct addr_cmp { ...@@ -146,7 +146,7 @@ struct addr_cmp {
namespace bi = boost::intrusive; namespace bi = boost::intrusive;
spinlock free_page_ranges_lock; mutex free_page_ranges_lock;
bi::set<page_range, bi::set<page_range,
bi::compare<addr_cmp>, bi::compare<addr_cmp>,
bi::member_hook<page_range, bi::member_hook<page_range,
...@@ -159,7 +159,7 @@ void* malloc_large(size_t size) ...@@ -159,7 +159,7 @@ void* malloc_large(size_t size)
size = (size + page_size - 1) & ~(page_size - 1); size = (size + page_size - 1) & ~(page_size - 1);
size += page_size; 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) { for (auto i = free_page_ranges.begin(); i != free_page_ranges.end(); ++i) {
auto header = &*i; auto header = &*i;
...@@ -200,7 +200,7 @@ void free_large(void* obj) ...@@ -200,7 +200,7 @@ void free_large(void* obj)
obj -= page_size; obj -= page_size;
auto header = static_cast<page_range*>(obj); 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; auto i = free_page_ranges.insert(*header).first;
if (i != free_page_ranges.begin()) { if (i != free_page_ranges.begin()) {
...@@ -220,7 +220,7 @@ unsigned large_object_size(void *obj) ...@@ -220,7 +220,7 @@ unsigned large_object_size(void *obj)
void* alloc_page() 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()); assert(!free_page_ranges.empty());
auto p = &*free_page_ranges.begin(); auto p = &*free_page_ranges.begin();
......
...@@ -37,7 +37,7 @@ private: ...@@ -37,7 +37,7 @@ private:
void add_page(); void add_page();
static page_header* to_header(free_object* object); static page_header* to_header(free_object* object);
private: private:
spinlock _lock; mutex _lock;
unsigned _size; unsigned _size;
struct page_header { 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