From 560667eef61691d0935bd990c61291f8baaa2b6f Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Wed, 3 Aug 2016 03:23:16 -0400 Subject: [PATCH] Only use 96-byte object heap on 64-bit platforms --- gc.c | 31 +++++++++---------------------- include/cyclone/types.h | 2 -- runtime.c | 6 +++--- 3 files changed, 12 insertions(+), 27 deletions(-) diff --git a/gc.c b/gc.c index f3169258..8ba2514e 100644 --- a/gc.c +++ b/gc.c @@ -572,23 +572,12 @@ void *gc_alloc(gc_heap_root * hrt, size_t size, char *obj, gc_thread_data * thd, heap_type = HEAP_SM; } else if (size <= 64) { heap_type = HEAP_64; -/* -TODO: -from http://stackoverflow.com/a/32717129/101258 +// Only use this heap on 64-bit platforms, where larger objs are used more often +// Code from http://stackoverflow.com/a/32717129/101258 #if INTPTR_MAX == INT64_MAX -// 64-bit -#elif INTPTR_MAX == INT32_MAX -// 32-bit -#else -#error Unknown pointer size or missing size macros! -#endif -*/ } else if (size <= 96) { heap_type = HEAP_96; -// } else if (size <= 128) { -// heap_type = HEAP_128; -// } else if (size <= 160) { -// heap_type = HEAP_160; +#endif } else if (size >= MAX_STACK_OBJ) { heap_type = HEAP_HUGE; } else { @@ -1066,12 +1055,10 @@ void gc_mut_cooperate(gc_thread_data * thd, int buf_len) cached_heap_total_sizes[HEAP_SM] * GC_COLLECTION_THRESHOLD) || (cached_heap_free_sizes[HEAP_64] < cached_heap_total_sizes[HEAP_64] * GC_COLLECTION_THRESHOLD) || +#if INTPTR_MAX == INT64_MAX (cached_heap_free_sizes[HEAP_96] < cached_heap_total_sizes[HEAP_96] * GC_COLLECTION_THRESHOLD) || -// (cached_heap_free_sizes[HEAP_128] < -// cached_heap_total_sizes[HEAP_128] * GC_COLLECTION_THRESHOLD) || -// (cached_heap_free_sizes[HEAP_160] < -// cached_heap_total_sizes[HEAP_160] * GC_COLLECTION_THRESHOLD) || +#endif (cached_heap_free_sizes[HEAP_REST] < cached_heap_total_sizes[HEAP_REST] * GC_COLLECTION_THRESHOLD))) { #if GC_DEBUG_TRACE @@ -1438,15 +1425,15 @@ void gc_collector() #if GC_DEBUG_TRACE total_size = cached_heap_total_sizes[HEAP_SM] + cached_heap_total_sizes[HEAP_64] + +#if INTPTR_MAX == INT64_MAX cached_heap_total_sizes[HEAP_96] + -// cached_heap_total_sizes[HEAP_128] + -// cached_heap_total_sizes[HEAP_160] + +#endif cached_heap_total_sizes[HEAP_REST]; total_free = cached_heap_free_sizes[HEAP_SM] + cached_heap_free_sizes[HEAP_64] + +#if INTPTR_MAX == INT64_MAX cached_heap_free_sizes[HEAP_96] + -// cached_heap_free_sizes[HEAP_128] + -// cached_heap_free_sizes[HEAP_160] + +#endif cached_heap_free_sizes[HEAP_REST]; fprintf(stderr, "sweep done, total_size = %zu, total_free = %zu, freed = %zu, elapsed = %ld\n", diff --git a/include/cyclone/types.h b/include/cyclone/types.h index 7c10b47a..2ad5c3b1 100644 --- a/include/cyclone/types.h +++ b/include/cyclone/types.h @@ -172,8 +172,6 @@ typedef enum { HEAP_SM = 0 // 32 byte objects (min gc_heap_align) , HEAP_64 , HEAP_96 -// , HEAP_128 -// , HEAP_160 , HEAP_REST // Everything else , HEAP_HUGE // Huge objects, 1 per page } gc_heap_type; diff --git a/runtime.c b/runtime.c index b914c004..06d72a48 100644 --- a/runtime.c +++ b/runtime.c @@ -214,9 +214,9 @@ void gc_init_heap(long heap_size) Cyc_heap->heap[HEAP_REST] = gc_heap_create(HEAP_REST, initial_heap_size, 0, 0); Cyc_heap->heap[HEAP_SM] = gc_heap_create(HEAP_SM, initial_heap_size, 0, 0); Cyc_heap->heap[HEAP_64] = gc_heap_create(HEAP_64, initial_heap_size, 0, 0); - Cyc_heap->heap[HEAP_96] = gc_heap_create(HEAP_96, initial_heap_size, 0, 0); -// Cyc_heap->heap[HEAP_128] = gc_heap_create(HEAP_128, initial_heap_size, 0, 0); -// Cyc_heap->heap[HEAP_160] = gc_heap_create(HEAP_160, initial_heap_size, 0, 0); + if (sizeof(void *) == 8) { // Only use this heap on 64-bit platforms + Cyc_heap->heap[HEAP_96] = gc_heap_create(HEAP_96, initial_heap_size, 0, 0); + } Cyc_heap->heap[HEAP_HUGE] = gc_heap_create(HEAP_HUGE, 1024, 0, 0); if (!ck_hs_init(&symbol_table,