More pagemap caching
svn: r12296
This commit is contained in:
parent
7f2ee89d4f
commit
8983dd96f3
|
@ -1035,7 +1035,7 @@ inline static void check_finalizers(int level)
|
||||||
work = next;
|
work = next;
|
||||||
} else {
|
} else {
|
||||||
GCDEBUG((DEBUGOUTF, "CFNL: Not finalizing %p (level %i on %p): %p / %i\n",
|
GCDEBUG((DEBUGOUTF, "CFNL: Not finalizing %p (level %i on %p): %p / %i\n",
|
||||||
work, work->eager_level, work->p, pagemap_find_page(work->p),
|
work, work->eager_level, work->p, pagemap_find_page(GC->page_maps, work->p),
|
||||||
marked(work->p)));
|
marked(work->p)));
|
||||||
prev = work;
|
prev = work;
|
||||||
work = GC_resolve(work->next);
|
work = GC_resolve(work->next);
|
||||||
|
@ -1858,7 +1858,7 @@ void GC_dump(void)
|
||||||
int GC_is_tagged(void *p)
|
int GC_is_tagged(void *p)
|
||||||
{
|
{
|
||||||
struct mpage *page;
|
struct mpage *page;
|
||||||
page = pagemap_find_page(p);
|
page = pagemap_find_page(GC->page_maps, p);
|
||||||
return page && (page->page_type == PAGE_TAGGED);
|
return page && (page->page_type == PAGE_TAGGED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2205,9 +2205,9 @@ static void repair_heap(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void gen1_free_mpage(mpage *page) {
|
static inline void gen1_free_mpage(PageMap pagemap, mpage *page) {
|
||||||
size_t real_page_size = page->big_page ? round_to_apage_size(page->size) : APAGE_SIZE;
|
size_t real_page_size = page->big_page ? round_to_apage_size(page->size) : APAGE_SIZE;
|
||||||
pagemap_remove(GC->page_maps, page);
|
pagemap_remove(pagemap, page);
|
||||||
free_backtrace(page);
|
free_backtrace(page);
|
||||||
free_pages(page->addr, real_page_size);
|
free_pages(page->addr, real_page_size);
|
||||||
free_mpage(page);
|
free_mpage(page);
|
||||||
|
@ -2215,11 +2215,12 @@ static inline void gen1_free_mpage(mpage *page) {
|
||||||
|
|
||||||
static inline void cleanup_vacated_pages(NewGC *gc) {
|
static inline void cleanup_vacated_pages(NewGC *gc) {
|
||||||
mpage *pages = gc->release_pages;
|
mpage *pages = gc->release_pages;
|
||||||
|
PageMap pagemap = gc->page_maps;
|
||||||
|
|
||||||
/* Free pages vacated by compaction: */
|
/* Free pages vacated by compaction: */
|
||||||
while (pages) {
|
while (pages) {
|
||||||
mpage *next = pages->next;
|
mpage *next = pages->next;
|
||||||
gen1_free_mpage(pages);
|
gen1_free_mpage(pagemap, pages);
|
||||||
pages = next;
|
pages = next;
|
||||||
}
|
}
|
||||||
gc->release_pages = NULL;
|
gc->release_pages = NULL;
|
||||||
|
@ -2229,16 +2230,16 @@ inline static void gen0_free_big_pages() {
|
||||||
mpage *work;
|
mpage *work;
|
||||||
mpage *next;
|
mpage *next;
|
||||||
NewGC *gc = GC;
|
NewGC *gc = GC;
|
||||||
|
PageMap pagemap = gc->page_maps;
|
||||||
|
|
||||||
for(work = gc->gen0.big_pages; work; work = next) {
|
for(work = gc->gen0.big_pages; work; work = next) {
|
||||||
next = work->next;
|
next = work->next;
|
||||||
pagemap_remove(GC->page_maps, work);
|
pagemap_remove(pagemap, work);
|
||||||
free_pages(work->addr, round_to_apage_size(work->size));
|
free_pages(work->addr, round_to_apage_size(work->size));
|
||||||
free_mpage(work);
|
free_mpage(work);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void clean_up_heap(void)
|
static void clean_up_heap(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -2258,7 +2259,7 @@ static void clean_up_heap(void)
|
||||||
/* remove work from list */
|
/* remove work from list */
|
||||||
if(prev) prev->next = next; else GC->gen1_pages[i] = next;
|
if(prev) prev->next = next; else GC->gen1_pages[i] = next;
|
||||||
if(next) work->next->prev = prev;
|
if(next) work->next->prev = prev;
|
||||||
gen1_free_mpage(work);
|
gen1_free_mpage(pagemap, work);
|
||||||
} else {
|
} else {
|
||||||
pagemap_add(pagemap, work);
|
pagemap_add(pagemap, work);
|
||||||
work->back_pointers = work->marked_on = 0;
|
work->back_pointers = work->marked_on = 0;
|
||||||
|
@ -2572,6 +2573,7 @@ void GC_free_all(void)
|
||||||
int i;
|
int i;
|
||||||
mpage *work;
|
mpage *work;
|
||||||
mpage *next;
|
mpage *next;
|
||||||
|
PageMap pagemap = GC->page_maps;
|
||||||
|
|
||||||
remove_signal_handler();
|
remove_signal_handler();
|
||||||
|
|
||||||
|
@ -2583,7 +2585,7 @@ void GC_free_all(void)
|
||||||
|
|
||||||
if (work->mprotected)
|
if (work->mprotected)
|
||||||
protect_pages(work->addr, work->big_page ? round_to_apage_size(work->size) : APAGE_SIZE, 1);
|
protect_pages(work->addr, work->big_page ? round_to_apage_size(work->size) : APAGE_SIZE, 1);
|
||||||
gen1_free_mpage(work);
|
gen1_free_mpage(pagemap, work);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user