Refactored code into gen0_free_big_pages

svn: r12280
This commit is contained in:
Kevin Tew 2008-11-05 21:07:32 +00:00
parent 4961879ff7
commit 453e20fd12

View File

@ -1474,6 +1474,7 @@ void GC_mark(const void *const_p)
backtrace_new_page(page); backtrace_new_page(page);
/* add to gen1 */
page->next = GC->gen1_pages[PAGE_BIG]; page->next = GC->gen1_pages[PAGE_BIG];
page->prev = NULL; page->prev = NULL;
if(page->next) page->next->prev = page; if(page->next) page->next->prev = page;
@ -2213,6 +2214,21 @@ static inline void cleanup_vacated_pages(NewGC *gc) {
} }
gc->release_pages = NULL; gc->release_pages = NULL;
} }
inline static void gen0_free_big_pages() {
mpage *work;
mpage *next;
NewGC *gc = GC;
for(work = gc->gen0.big_pages; work; work = next) {
next = work->next;
pagemap_remove(work);
free_pages(work->addr, round_to_apage_size(work->size));
free_mpage(work);
}
}
static void clean_up_heap(void) static void clean_up_heap(void)
{ {
struct mpage *work, *prev; struct mpage *work, *prev;
@ -2221,13 +2237,7 @@ static void clean_up_heap(void)
gc->memory_in_use = 0; gc->memory_in_use = 0;
/* For the purposes of this little loop, s/prev/next/ */ gen0_free_big_pages();
for(work = gc->gen0.big_pages; work; work = prev) {
prev = work->next;
pagemap_remove(work);
free_pages(work->addr, round_to_apage_size(work->size));
free_mpage(work);
}
for(i = 0; i < PAGE_TYPES; i++) { for(i = 0; i < PAGE_TYPES; i++) {
struct mpage *prev = NULL; struct mpage *prev = NULL;
@ -2565,11 +2575,7 @@ void GC_free_all(void)
remove_signal_handler(); remove_signal_handler();
for (work = GC->gen0.big_pages; work; work = next) { gen0_free_big_pages();
next = work->next;
free_pages(work->addr, round_to_apage_size(work->size));
free_mpage(work);
}
for(i = 0; i < PAGE_TYPES; i++) { for(i = 0; i < PAGE_TYPES; i++) {
for (work = GC->gen1_pages[i]; work; work = next) { for (work = GC->gen1_pages[i]; work; work = next) {