/* addfreeblock*/ static void *add_free_block(void *bp,size_t size){ //dbg_printf("addfree%p\n",bp); //REQUIRES(in_heap(bp)); dbg_printf("add free%p %lu\n",bp,size); int list=0; size>>=5; while((list<18)&&(size>1)){ size=size>>1; list++; } free_list=(void *)((uint32_t *)seg_list+list);//get free_list head dbg_printf("add free list%d %p\n",list,free_list); set_succ(bp,get_succ_offset(free_list)); set_pred(bp,get_offset(free_list)); if (get_succ_offset(free_list)!=0) set_pred(succ_blkp(free_list),get_offset(bp)); //set new list header set_succ(free_list,get_offset(bp)); bp=free_list; while(bp!=base){ dbg_printf("list: %p->:\n",bp); bp=succ_blkp(bp); } return bp; }
//address static void *add_free_block(void *bp){ void* block; if (free_list==base){ set_succ(bp,0); set_pred(bp,0); free_list=bp; return bp; } int i=0; block=free_list; size_t block_off; while(block!=base){ block_off=get_offset(block); if (get_offset(bp)<block_off){ set_succ(bp,block_off); set_pred(bp,get_pred_offset(block)); set_pred(block,get_offset(bp)); if (i==0) free_list=bp; return bp; } block=succ_blkp(block); i++; } set_succ(bp,0); set_pred(bp,block_off); set_succ(get_addr(block_off),get_offset(bp)); return bp; }
static void place(void *bp, size_t asize) { //dbg_printf("place%p\n",bp); size_t csize = GET_SIZE(HDRP(bp)); // void *remain_blk; size_t remain_size=csize-asize; if ((remain_size) >= 16) { void *remain_blk; //delete_free_block(bp); size_t predoff=get_pred_offset(bp); size_t succoff=get_succ_offset(bp); alloc_block(bp,asize); remain_blk= NEXT_BLKP(bp); PUT(HDRP(remain_blk), PACK(remain_size, 0)); PUT(FTRP(remain_blk), PACK(remain_size, 0)); size_t re_off=get_offset(remain_blk); set_succ(remain_blk,succoff); set_pred(remain_blk,predoff); // if (predoff){ set_succ(get_addr(predoff),re_off); // } // else free_list=remain_blk; if (succoff){ set_pred(get_addr(succoff),re_off); } } else { delete_free_block(bp); PUT(HDRP(bp), PACK(csize, 1)); PUT(FTRP(bp), PACK(csize, 1)); } }
/* addfreeblock*/ static void *add_free_block(void *bp){ //dbg_printf("addfree%p\n",bp); //REQUIRES(in_heap(bp)); //printf("free%p",free_list); set_succ(bp,get_succ_offset(free_list)); set_pred(bp,get_offset(free_list)); if (get_succ_offset(free_list)!=0) set_pred(succ_blkp(free_list),get_offset(bp)); //set new list header set_succ(free_list,get_offset(bp)); return bp; }
/* addfreeblock*/ static void *add_free_block(void *bp){ REQUIRES(in_heap(bp)); set_succ(bp,get_offset(free_list)); set_pred(bp,0); if (get_offset(free_list)!=0) set_pred(free_list,get_offset(bp)); //set new list header free_list=bp; return bp; }
static void delete_free_block(void *bp){ //dbg_printf("delete%p\n",bp); void *pred_block=pred_blkp(bp); void *succ_block=succ_blkp(bp); // if ((free_list== bp)&&(get_succ_offset(bp)==0)){ // free_list=base; //} /* if (get_pred_offset(bp)==0){//header set_pred(succ_block,0); free_list=succ_block; }*/ set_succ(pred_block,get_succ_offset(bp)); /* else if (get_succ_offset(bp)==0){ set_succ(pred_block,0); } else { set_succ(pred_block,get_succ_offset(bp)); set_pred(succ_block,get_pred_offset(bp)); } */ if (get_succ_offset(bp)) set_pred(succ_block,get_pred_offset(bp)); }
static void delete_free_block(void *bp){ void *pred_block=pred_blkp(bp); void *succ_block=succ_blkp(bp); if (get_pred_offset(bp)==0){//header set_pred(succ_block,0); free_list=succ_block; } else if (get_succ_offset(bp)==0){ set_succ(pred_block,0); } else { set_succ(pred_block,get_succ_offset(bp)); set_pred(succ_block,get_pred_offset(bp)); } }
static void delete_free_block(void *bp){ dbg_printf("delete%p\n",bp); void *pred_block=pred_blkp(bp); void *succ_block=succ_blkp(bp); set_succ(pred_block,get_succ_offset(bp)); if (get_succ_offset(bp)) set_pred(succ_block,get_pred_offset(bp)); }
//address static void *add_free_block(void *bp) { //dbg_printf("addfree%p\n",bp); void* block; if (free_list==base) { set_succ(bp,0); set_pred(bp,0); free_list=bp; return bp; } //int i=0; block=free_list; size_t block_off; while(block!=base) { //printf("freehead%p",block); block_off=get_offset(block); if (get_offset(bp)<block_off) { set_succ(bp,block_off); set_pred(bp,get_pred_offset(block)); void *pred=pred_blkp(block); set_pred(block,get_offset(bp)); if (block==free_list) free_list=bp; else { set_succ(pred,get_offset(bp)); }//printf("add%p %p %p %p\n",bp,pred_blkp(bp),succ_blkp(bp),block); return bp; } block=succ_blkp(block); // i++; } set_succ(bp,0); set_pred(bp,block_off); set_succ(get_addr(block_off),get_offset(bp)); return bp; }
void trial(int cnt, _Bool train, double *err) { // get problem function state and solution double *state = func_state(train); double answer = func_answer(train); // create match set NODE *mset = NULL, *kset = NULL; int msize = 0, mnum = 0; set_match(&mset, &msize, &mnum, state, cnt, &kset); // calculate system prediction and track performance double pre = set_pred(&mset, msize, state); err[cnt%PERF_AVG_TRIALS] = fabs(answer - pre); if(train) { // provide reinforcement to the set set_update(&mset, &msize, &mnum, answer, &kset, state); // run the genetic algorithm ga(&mset, msize, mnum, cnt, &kset); } // clean up set_kill(&kset); // kills deleted classifiers set_free(&mset); // frees the match set list }
static void* coalesce_free(void *bp) //bp point to header { dbg_printf("coalesce free %p\n",bp); void *prev_blk=PREV_BLKP(bp); void *next_blk=NEXT_BLKP(bp); size_t prev_alloc = GET_ALLOC(FTRP(prev_blk)); size_t next_alloc = GET_ALLOC(HDRP(next_blk)); size_t size = GET_SIZE(HDRP(bp)); if (prev_alloc && next_alloc) { /* Case 1 */ add_free_block(bp); return bp; } else if (prev_alloc && !next_alloc) { /* Case 2 */ size += GET_SIZE(HDRP(next_blk)); //delete_free_block(next_blk); PUT(HDRP(bp), PACK(size, 0)); PUT(FTRP(bp), PACK(size,0)); size_t predoff=get_pred_offset(next_blk); size_t succoff=get_succ_offset(next_blk); set_pred(bp,predoff); set_succ(bp,succoff); if(predoff) { set_succ(get_addr(predoff),get_offset(bp)); } else { free_list=bp; } if(succoff) set_pred(get_addr(succoff),get_offset(bp)); } else if (!prev_alloc && next_alloc) { /* Case 3 */ size += GET_SIZE(HDRP(prev_blk)); // delete_free_block(prev_blk); PUT(FTRP(bp), PACK(size, 0)); PUT(HDRP(prev_blk), PACK(size, 0)); bp = prev_blk; } else { /* Case 4 */ size += GET_SIZE(HDRP(prev_blk)) + GET_SIZE(FTRP(next_blk)); //size_t predoff=get_pred_offset(prev_blk); size_t succoff=get_succ_offset(next_blk); //delete_free_block(prev_blk); //delete_free_block(next_blk); PUT(HDRP(prev_blk), PACK(size, 0)); PUT(FTRP(next_blk), PACK(size, 0)); bp = prev_blk; //set_pred(bp,predoff); set_succ(bp,succoff); //if(predoff){ //set_succ(get_addr(predoff),get_offset(bp)); //free_list=bp; // } if(succoff) set_pred(get_addr(succoff),get_offset(bp)); } // add_free_block(bp); return bp; }