Merge pull request #65 from microsoft/queue_of_slabs

Use a queue of slabs for free lists
This commit is contained in:
David Chisnall
2019-07-08 20:53:06 +01:00
committed by GitHub
3 changed files with 27 additions and 2 deletions

View File

@@ -63,6 +63,7 @@ namespace snmalloc
std::is_same<decltype(T::next), T*>::value, "T->next must be a T*");
T* head = Terminator();
T* tail = Terminator();
public:
bool is_empty()
@@ -96,6 +97,8 @@ namespace snmalloc
if (head != Terminator())
head->prev = item;
else
tail = item;
head = item;
#ifndef NDEBUG
@@ -103,6 +106,26 @@ namespace snmalloc
#endif
}
void insert_back(T* item)
{
#ifndef NDEBUG
debug_check_not_contains(item);
#endif
item->prev = tail;
item->next = Terminator();
if (tail != Terminator())
tail->next = item;
else
head = item;
tail = item;
#ifndef NDEBUG
debug_check();
#endif
}
void remove(T* item)
{
#ifndef NDEBUG
@@ -111,6 +134,8 @@ namespace snmalloc
if (item->next != Terminator())
item->next->prev = item->prev;
else
tail = item->prev;
if (item->prev != Terminator())
item->prev->next = item->next;

View File

@@ -1114,7 +1114,7 @@ namespace snmalloc
if ((allow_reserve == NoReserve) && (slab == nullptr))
return nullptr;
sl.insert(slab->get_link());
sl.insert_back(slab->get_link());
}
auto& ffl = small_fast_free_lists[sizeclass];
return slab->alloc<zero_mem>(

View File

@@ -215,7 +215,7 @@ namespace snmalloc
meta.link = index;
// Push on the list of slabs for this sizeclass.
sl->insert(meta.get_link(this));
sl->insert_back(meta.get_link(this));
meta.debug_slab_invariant(is_short(), this);
return Superslab::NoSlabReturn;
}