Move release_page to NewGC struct
svn: r12266
This commit is contained in:
parent
5a76a7b3bb
commit
c2e28f8d70
|
@ -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;
|
||||||
|
@ -2325,16 +2336,9 @@ static void clean_up_heap(void)
|
||||||
for(work = pages[i]; work; work = work->next)
|
for(work = pages[i]; work; work = work->next)
|
||||||
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)
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user