mirror of
https://github.com/justinethier/cyclone.git
synced 2025-05-23 20:15:05 +02:00
Free empty heap pages
This commit is contained in:
parent
d362f15ede
commit
8a3ed8e1a0
1 changed files with 15 additions and 10 deletions
25
gc.c
25
gc.c
|
@ -224,7 +224,7 @@ gc_heap *gc_heap_free(gc_heap *page, gc_heap *prev_page)
|
|||
{
|
||||
// At least for now, do not free first page
|
||||
if (prev_page == NULL || page == NULL) {
|
||||
return NULL;
|
||||
return page;
|
||||
}
|
||||
//#if GC_DEBUG_PRINTFS
|
||||
fprintf(stderr, "DEBUG freeing heap page at addr: %p\n", page);
|
||||
|
@ -237,9 +237,14 @@ gc_heap *gc_heap_free(gc_heap *page, gc_heap *prev_page)
|
|||
|
||||
int gc_is_heap_empty(gc_heap *h)
|
||||
{
|
||||
// TODO: this function does not work yet!!
|
||||
if (h == NULL || h->free_list == NULL) return 1;
|
||||
return 0;
|
||||
gc_free_list *f;
|
||||
if (!h || !h->free_list) return 0;
|
||||
|
||||
f = h->free_list;
|
||||
if (f->size != 0 || !f->next) return 0;
|
||||
|
||||
f = f->next;
|
||||
return (f->size + gc_heap_align(gc_free_chunk_size)) == h->size;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -776,12 +781,12 @@ size_t gc_sweep(gc_heap * h, int heap_type, size_t * sum_freed_ptr)
|
|||
// TODO: with huge heaps, this becomes more important. one of the huge
|
||||
// pages only has one object, so it is likely that the page
|
||||
// will become free at some point and could be reclaimed.
|
||||
// if (gc_is_heap_empty(h)){
|
||||
// unsigned int h_size = h->size;
|
||||
// gc_heap_free(h, prev_h);
|
||||
// cached_heap_free_sizes[heap_type] -= h_size;
|
||||
// cached_heap_total_sizes[heap_type] -= h_size;
|
||||
// }
|
||||
if (gc_is_heap_empty(h)){
|
||||
unsigned int h_size = h->size;
|
||||
h = gc_heap_free(h, prev_h);
|
||||
cached_heap_free_sizes[heap_type] -= h_size;
|
||||
cached_heap_total_sizes[heap_type] -= h_size;
|
||||
}
|
||||
sum_freed += heap_freed;
|
||||
heap_freed = 0;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue