Move release_page to NewGC struct

svn: r12266
This commit is contained in:
Kevin Tew 2008-11-05 21:06:01 +00:00
parent 5a76a7b3bb
commit c2e28f8d70
2 changed files with 19 additions and 14 deletions

View File

@ -298,7 +298,6 @@ static const char *zero_sized[4]; /* all 0-sized allocs get this */
static Mark_Proc mark_table[NUMBER_OF_TAGS]; /* the table of mark procs */ static Mark_Proc mark_table[NUMBER_OF_TAGS]; /* the table of mark procs */
static Fixup_Proc fixup_table[NUMBER_OF_TAGS]; /* the table of repair procs */ static Fixup_Proc fixup_table[NUMBER_OF_TAGS]; /* the table of repair procs */
static unsigned long memory_in_use = 0; /* the amount of memory in use */ static unsigned long memory_in_use = 0; /* the amount of memory in use */
static struct mpage *release_page = NULL;
static int avoid_collection; static int avoid_collection;
/* These procedures modify or use the page map. The page map provides us very /* These procedures modify or use the page map. The page map provides us very
@ -2146,8 +2145,9 @@ inline static void do_heap_compact(void)
if(prev) prev->next = work->next; else pages[i] = work->next; if(prev) prev->next = work->next; else pages[i] = work->next;
if(work->next) work->next->prev = prev; if(work->next) work->next->prev = prev;
work->next = release_page; /* push work onto GC->release_pages */
release_page = work; work->next = GC->release_pages;
GC->release_pages = work;
/* add the old page to the page map so fixups can find forwards */ /* add the old page to the page map so fixups can find forwards */
pagemap_add(work); pagemap_add(work);
@ -2276,6 +2276,17 @@ static void repair_heap(void)
} }
} }
static inline void cleanup_vacated_pages(mpage *pages) {
/* Free pages vacated by compaction: */
while (pages) {
mpage *prev = pages->next;
pagemap_remove(pages);
free_backtrace(pages);
free_pages(pages->addr, APAGE_SIZE);
free_mpage(pages);
pages = prev;
}
}
static void clean_up_heap(void) static void clean_up_heap(void)
{ {
struct mpage *work, *prev; struct mpage *work, *prev;
@ -2326,15 +2337,8 @@ static void clean_up_heap(void)
memory_in_use += work->size; memory_in_use += work->size;
} }
/* Free pages vacated by compaction: */ cleanup_vacated_pages(GC->release_pages);
while (release_page) { GC->release_pages = NULL;
prev = release_page->next;
pagemap_remove(release_page);
free_backtrace(release_page);
free_pages(release_page->addr, APAGE_SIZE);
free_mpage(release_page);
release_page = prev;
}
} }
static void protect_old_pages(void) static void protect_old_pages(void)

View File

@ -85,6 +85,8 @@ typedef struct NewGC {
void *park[2]; void *park[2];
void *park_save[2]; void *park_save[2];
mpage *release_pages;
int generations_available; int generations_available;
unsigned char full_needed_for_finalization :1; unsigned char full_needed_for_finalization :1;
unsigned char no_further_modifications :1; unsigned char no_further_modifications :1;
@ -95,7 +97,6 @@ typedef struct NewGC {
unsigned long num_minor_collects; unsigned long num_minor_collects;
unsigned long num_major_collects; unsigned long num_major_collects;
unsigned short weak_array_tag; unsigned short weak_array_tag;
unsigned short weak_box_tag; unsigned short weak_box_tag;
unsigned short ephemeron_tag; unsigned short ephemeron_tag;