| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- #include "dmm_adaptor.h"
- void update_frag_params(heap_t *heap) {
- switch(heap->dmm_knobs.frag_state) {
- default :
- heap->dmm_knobs.percentage = 0;
- heap->dmm_knobs.max_coalesce_size = -1;
- heap->dmm_knobs.min_split_size = 0;
- heap->dmm_knobs.empty_threshold = 1.5;
- break;
- case 1 :
- heap->dmm_knobs.percentage = 20;
- heap->dmm_knobs.max_coalesce_size = 400;
- heap->dmm_knobs.min_split_size = 1200;
- break;
- case 2 :
- heap->dmm_knobs.percentage = 40;
- heap->dmm_knobs.max_coalesce_size = 800;
- heap->dmm_knobs.min_split_size = 1000;
- break;
- case 3 :
- heap->dmm_knobs.percentage = 60;
- heap->dmm_knobs.max_coalesce_size = 1200;
- heap->dmm_knobs.min_split_size = 800;
- break;
- case 4 :
- heap->dmm_knobs.percentage = 80;
- heap->dmm_knobs.max_coalesce_size = 1600;
- heap->dmm_knobs.min_split_size = 600;
- break;
- case 5 :
- heap->dmm_knobs.percentage = 100;
- heap->dmm_knobs.max_coalesce_size = 2000;
- heap->dmm_knobs.min_split_size = 300;
- break;
- }
- }
- void update_foot_params(heap_t *heap) {
- switch(heap->dmm_knobs.foot_state) {
- default :
- heap->dmm_knobs.empty_threshold = 0.8;
- break;
- case 2 :
- heap->dmm_knobs.empty_threshold = 0.6;
- break;
- case 3 :
- heap->dmm_knobs.empty_threshold = 0.4;
- break;
- case 4 :
- heap->dmm_knobs.empty_threshold = 0.2;
- break;
- case 5 :
- heap->dmm_knobs.empty_threshold = 0.0;
- break;
- }
- }
- float get_current_fragmentation(heap_t *heap) {
- float fragmentation;
- fragmentation = (float) heap->dmm_stats.mem_allocated /
- (float) heap->dmm_stats.mem_requested - 1.0;
- if(fragmentation <= MIN_FRAG_THRESHOLD &&
- heap->dmm_stats.mem_reserved < heap->dmm_knobs.mem_threshold) {
- heap->dmm_knobs.frag_state = 0;
- heap->dmm_knobs.foot_state = 0;
- update_frag_params(heap);
- }
- return fragmentation;
- }
- void check_footprint(heap_t *heap) {
- if(heap->dmm_stats.mem_allocated > heap->dmm_knobs.mem_threshold) {
- if(heap->dmm_knobs.frag_state > heap->dmm_knobs.foot_state) {
- heap->dmm_knobs.foot_state = heap->dmm_knobs.frag_state;
- } else {
- heap->dmm_knobs.foot_state++;
- }
- update_foot_params(heap);
- }
- }
- void malloc_state_refresh(heap_t *heap) {
- float fragmentation;
- fragmentation = get_current_fragmentation(heap);
- /* Check fragmentation */
- if(fragmentation >= heap->dmm_knobs.frag_threshold &&
- heap->dmm_stats.mem_requested != 0) {
- if(heap->dmm_knobs.foot_state > heap->dmm_knobs.frag_state) {
- heap->dmm_knobs.frag_state = heap->dmm_knobs.foot_state;
- } else {
- heap->dmm_knobs.frag_state++;
- }
- update_frag_params(heap);
- }
- check_footprint(heap);
- }
- void free_state_refresh(heap_t *heap) {
- float fragmentation;
- fragmentation = get_current_fragmentation(heap);
- check_footprint(heap);
- }
|