Index: src/heap/spaces.cc |
diff --git a/src/heap/spaces.cc b/src/heap/spaces.cc |
index 259ee75e0d09b978c8ac6ed93ac3e18331a346fd..c565fe75093484b49c21696a9274496ba7fd4d41 100644 |
--- a/src/heap/spaces.cc |
+++ b/src/heap/spaces.cc |
@@ -2218,6 +2218,46 @@ intptr_t FreeList::Concatenate(FreeList* free_list) { |
} |
+void FreeList::Divide(FreeList** free_lists, int num, intptr_t limit) { |
+ CHECK(num > 0); |
+ CHECK(free_lists != nullptr); |
+ if (limit == 0) { |
+ limit = std::numeric_limits<intptr_t>::max(); |
+ } |
+ int size = 0; |
+ int cnt = 0; |
+ FreeSpace* space = nullptr; |
+ while (((space = huge_list_.PickNodeFromList(&size)) != nullptr) && |
+ (free_lists[cnt % num]->available() < limit)) { |
+ owner()->RemoveMemory(size); |
+ free_lists[cnt % num]->huge_list_.owner()->owner()->AddExternalMemory( |
+ space->address(), size); |
+ cnt++; |
+ } |
+ while (((space = large_list_.PickNodeFromList(&size)) != nullptr) && |
+ (free_lists[cnt % num]->available() < limit)) { |
+ owner()->RemoveMemory(size); |
+ free_lists[cnt % num]->large_list_.owner()->owner()->AddExternalMemory( |
+ space->address(), size); |
+ cnt++; |
+ } |
+ while (((space = medium_list_.PickNodeFromList(&size)) != nullptr) && |
+ (free_lists[cnt % num]->available() < limit)) { |
+ owner()->RemoveMemory(size); |
+ free_lists[cnt % num]->medium_list_.owner()->owner()->AddExternalMemory( |
+ space->address(), size); |
+ cnt++; |
+ } |
+ while (((space = small_list_.PickNodeFromList(&size)) != nullptr) && |
+ (free_lists[cnt % num]->available() < limit)) { |
+ owner()->RemoveMemory(size); |
+ free_lists[cnt % num]->small_list_.owner()->owner()->AddExternalMemory( |
+ space->address(), size); |
+ cnt++; |
+ } |
+} |
+ |
+ |
void FreeList::Reset() { |
small_list_.Reset(); |
medium_list_.Reset(); |