static void major_dump_heap (FILE *heap_dump_file) { MSBlockInfo *block; int *slots_available = alloca (sizeof (int) * num_block_obj_sizes); int *slots_used = alloca (sizeof (int) * num_block_obj_sizes); int i; for (i = 0; i < num_block_obj_sizes; ++i) slots_available [i] = slots_used [i] = 0; FOREACH_BLOCK (block) { int index = ms_find_block_obj_size_index (block->obj_size); int count = MS_BLOCK_FREE / block->obj_size; slots_available [index] += count; for (i = 0; i < count; ++i) { if (MS_OBJ_ALLOCED (MS_BLOCK_OBJ (block, i), block)) ++slots_used [index]; } } END_FOREACH_BLOCK; fprintf (heap_dump_file, "<occupancies>\n"); for (i = 0; i < num_block_obj_sizes; ++i) { fprintf (heap_dump_file, "<occupancy size=\"%d\" available=\"%d\" used=\"%d\" />\n", block_obj_sizes [i], slots_available [i], slots_used [i]); } fprintf (heap_dump_file, "</occupancies>\n"); FOREACH_BLOCK (block) { int count = MS_BLOCK_FREE / block->obj_size; int i; int start = -1; fprintf (heap_dump_file, "<section type=\"%s\" size=\"%zu\">\n", "old", (size_t)MS_BLOCK_FREE); for (i = 0; i <= count; ++i) { if ((i < count) && MS_OBJ_ALLOCED (MS_BLOCK_OBJ (block, i), block)) { if (start < 0) start = i; } else { if (start >= 0) { mono_sgen_dump_occupied (MS_BLOCK_OBJ (block, start), MS_BLOCK_OBJ (block, i), block->block); start = -1; } } } fprintf (heap_dump_file, "</section>\n"); } END_FOREACH_BLOCK; }
void #ifdef SGEN_PARALLEL_MARK #ifdef FIXED_HEAP mono_sgen_marksweep_fixed_par_init #else mono_sgen_marksweep_par_init #endif #else #ifdef FIXED_HEAP mono_sgen_marksweep_fixed_init #else mono_sgen_marksweep_init #endif #endif (SgenMajorCollector *collector) { int i; #ifndef FIXED_HEAP mono_sgen_register_fixed_internal_mem_type (INTERNAL_MEM_MS_BLOCK_INFO, sizeof (MSBlockInfo)); #endif num_block_obj_sizes = ms_calculate_block_obj_sizes (MS_BLOCK_OBJ_SIZE_FACTOR, NULL); block_obj_sizes = mono_sgen_alloc_internal_dynamic (sizeof (int) * num_block_obj_sizes, INTERNAL_MEM_MS_TABLES); ms_calculate_block_obj_sizes (MS_BLOCK_OBJ_SIZE_FACTOR, block_obj_sizes); /* { int i; g_print ("block object sizes:\n"); for (i = 0; i < num_block_obj_sizes; ++i) g_print ("%d\n", block_obj_sizes [i]); } */ for (i = 0; i < MS_BLOCK_TYPE_MAX; ++i) free_block_lists [i] = mono_sgen_alloc_internal_dynamic (sizeof (MSBlockInfo*) * num_block_obj_sizes, INTERNAL_MEM_MS_TABLES); for (i = 0; i < MS_NUM_FAST_BLOCK_OBJ_SIZE_INDEXES; ++i) fast_block_obj_size_indexes [i] = ms_find_block_obj_size_index (i * 8); for (i = 0; i < MS_NUM_FAST_BLOCK_OBJ_SIZE_INDEXES * 8; ++i) g_assert (MS_BLOCK_OBJ_SIZE_INDEX (i) == ms_find_block_obj_size_index (i)); LOCK_INIT (ms_block_list_mutex); mono_counters_register ("# major blocks allocated", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_major_blocks_alloced); mono_counters_register ("# major blocks freed", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_major_blocks_freed); collector->section_size = MAJOR_SECTION_SIZE; #ifdef SGEN_PARALLEL_MARK collector->is_parallel = TRUE; #else collector->is_parallel = FALSE; #endif collector->alloc_heap = major_alloc_heap; collector->is_object_live = major_is_object_live; collector->alloc_small_pinned_obj = major_alloc_small_pinned_obj; collector->alloc_degraded = major_alloc_degraded; collector->copy_or_mark_object = major_copy_or_mark_object; collector->alloc_object = major_alloc_object; collector->free_pinned_object = free_pinned_object; collector->iterate_objects = major_iterate_objects; collector->free_non_pinned_object = major_free_non_pinned_object; collector->find_pin_queue_start_ends = major_find_pin_queue_start_ends; collector->pin_objects = major_pin_objects; collector->init_to_space = major_init_to_space; collector->sweep = major_sweep; collector->check_scan_starts = major_check_scan_starts; collector->dump_heap = major_dump_heap; collector->get_used_size = major_get_used_size; collector->start_nursery_collection = major_start_nursery_collection; collector->finish_nursery_collection = major_finish_nursery_collection; collector->finish_major_collection = major_finish_major_collection; collector->ptr_is_in_non_pinned_space = major_ptr_is_in_non_pinned_space; collector->obj_is_from_pinned_alloc = obj_is_from_pinned_alloc; collector->report_pinned_memory_usage = major_report_pinned_memory_usage; collector->get_num_major_sections = get_num_major_sections; #ifdef FIXED_HEAP collector->handle_gc_param = major_handle_gc_param; collector->print_gc_param_usage = major_print_gc_param_usage; #else collector->handle_gc_param = NULL; collector->print_gc_param_usage = NULL; #endif FILL_COLLECTOR_COPY_OBJECT (collector); FILL_COLLECTOR_SCAN_OBJECT (collector); }