mirror of
https://github.com/justinethier/cyclone.git
synced 2025-05-23 20:15:05 +02:00
WIP
This commit is contained in:
parent
a2dccabdb7
commit
040ce4f017
1 changed files with 27 additions and 5 deletions
32
gc.c
32
gc.c
|
@ -225,9 +225,9 @@ gc_heap *gc_heap_free(gc_heap *page, gc_heap *prev_page)
|
|||
if (prev_page == NULL || page == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
#if GC_DEBUG_PRINTFS
|
||||
//#if GC_DEBUG_PRINTFS
|
||||
fprintf(stderr, "DEBUG freeing heap page at addr: %p\n", page);
|
||||
#endif
|
||||
//#endif
|
||||
|
||||
prev_page->next = page->next;
|
||||
free(page);
|
||||
|
@ -267,6 +267,15 @@ void gc_print_stats(gc_heap * h)
|
|||
}
|
||||
}
|
||||
|
||||
int gc_is_heap_empty(gc_heap *h)
|
||||
{
|
||||
return (h && (h->free_list == NULL) ||
|
||||
(h->free_list->next &&
|
||||
// TODO: think this case is busted, need to debug
|
||||
h->free_list->next->next == NULL &&
|
||||
h->free_list->next->size == h->size));
|
||||
}
|
||||
|
||||
// Copy given object into given heap object
|
||||
char *gc_copy_obj(object dest, char *obj, gc_thread_data * thd)
|
||||
{
|
||||
|
@ -637,7 +646,7 @@ size_t gc_sweep(gc_heap * h, int heap_type, size_t * sum_freed_ptr)
|
|||
size_t freed, max_freed = 0, heap_freed = 0, sum_freed = 0, size;
|
||||
object p, end;
|
||||
gc_free_list *q, *r, *s;
|
||||
gc_heap *orig_heap_ptr = h, *prev_h = h;
|
||||
gc_heap *orig_heap_ptr = h, *prev_h = NULL;
|
||||
|
||||
//
|
||||
// Lock the heap to prevent issues with allocations during sweep
|
||||
|
@ -648,7 +657,13 @@ size_t gc_sweep(gc_heap * h, int heap_type, size_t * sum_freed_ptr)
|
|||
// how much time is even spent sweeping
|
||||
//
|
||||
pthread_mutex_lock(&heap_lock);
|
||||
for (; h; h = h->next) { // All heaps
|
||||
//
|
||||
//// DEBUGGING:
|
||||
//fprintf(stderr, "\nBefore sweep -------------------------\n");
|
||||
//fprintf(stderr, "Heap %d diagnostics:\n", heap_type);
|
||||
//gc_print_stats(orig_heap_ptr);
|
||||
//
|
||||
for (; h; prev_h = h, h = h->next) { // All heaps
|
||||
#if GC_DEBUG_TRACE
|
||||
fprintf(stderr, "sweep heap %p, size = %zu\n", h, (size_t) h->size);
|
||||
#endif
|
||||
|
@ -747,11 +762,18 @@ size_t gc_sweep(gc_heap * h, int heap_type, size_t * sum_freed_ptr)
|
|||
}
|
||||
//h->free_size += heap_freed;
|
||||
cached_heap_free_sizes[heap_type] += heap_freed;
|
||||
// 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;
|
||||
// }
|
||||
sum_freed += heap_freed;
|
||||
heap_freed = 0;
|
||||
}
|
||||
|
||||
// DEBUGGING:
|
||||
//// DEBUGGING:
|
||||
//fprintf(stderr, "\nAfter sweep -------------------------\n");
|
||||
//fprintf(stderr, "Heap %d diagnostics:\n", heap_type);
|
||||
//gc_print_stats(orig_heap_ptr);
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue