Only use 96-byte object heap on 64-bit platforms

This commit is contained in:
Justin Ethier 2016-08-03 03:23:16 -04:00
parent 4049304095
commit 560667eef6
3 changed files with 12 additions and 27 deletions

31
gc.c
View file

@ -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",

View file

@ -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;

View file

@ -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,