后面部分

来源:互联网 发布:tensorflow 目标识别 编辑:程序博客网 时间:2024/05/01 05:24

void *min_malloc(uint_32 size)
{
    void *addr=NULL;
    uint_32 save_free;
 block *blk=NULL;
 block *blk_c=NULL;          /* 暂存block;*/
 block *blk_new=NULL;
 
 if ( memery == NULL) {
  memery = (void *)malloc(size);
  if(memery == NULL || size <= sizeof(block)) {
   printf("memery error/n");
   return addr;
  }
  blk = (block *)memery;
  blk->flag = 0;
  blk->free.pre = &(malloc_header.free);                       /* 首次申请时:将管理空闲的前指向null;*/
  blk->free.next = &(malloc_header.free);
  blk->all.pre = &(malloc_header.all);
  blk->all.next = &(malloc_header.all);
  malloc_header.all.pre = &(blk->all);                                    // 初始节点设置
  malloc_header.all.next = &(blk->all);
  malloc_header.free.pre = &(blk->free);
  malloc_header.free.next = &(blk->free);
  blk->adm_size = size - sizeof(block);
  save_size = size;
  addr = (void *)((uint_32)memery + sizeof(block));
 } else {
   blk  = (block *)((uint_32)(malloc_header.free.next)-offsetof(block,free));           //  将blk 指向头结点free_next 地址;
   while( blk->flag == 1 || blk->adm_size < size) {
     blk_c=blk;         /* 保存当前blk值,便于下一次blk 指向下一地址时可以对当前值操作 */                       
     blk = (block *)((uint_32)(blk->free.next) - offsetof(block,free));
     if(blk == &(malloc_header)) {
      printf("out of memery!/n");
            return addr;
     }
   }
   blk->flag = 1;
   save_free =  blk->adm_size - size;      //compare current blk->adm_size with size ,
            blk_c = blk;
   addr = (void *)((uint_32)blk + sizeof(block));
   blk_new = (block *)((uint_32)blk + size + sizeof(block));   /* 新建的block */
   if(blk_new < ((block *)((uint_32)memery + save_size - sizeof(block)) ) && (save_free > sizeof(block))) {
    blk_new->flag = 0;
    blk_new->adm_size = save_free - sizeof(block);
    blk_c->adm_size = size;     
    blk_new->all.next = blk_c->all.next;   //  the operate of all;change their pointer. 
                  blk_new->all.pre = &(blk_c->all);
        ((block *)((uint_32)(blk_c->all.next) - offsetof(block,all)))->all.pre = &(blk_new->all);
    blk_c->all.next = &(blk_new->all);             
    blk_new->free.pre = blk_c->free.pre;  // the operate to free block;
    blk_new->free.next = blk_c->free.next;
    ((block *)((uint_32)(blk_c->free.pre) - offsetof(block,free)))->free.next = &(blk_new->free);
    ((block *)((uint_32)(blk_c->free.next) - offsetof(block,free)))->free.pre = &(blk_new->free);
    blk_c->free.pre = NULL;
    blk_c->free.next = NULL;  
   } else {
    ((block *)((uint_32)(blk_c->free.pre) - offsetof(block,free)))->free.next = blk_c->free.next;
    ((block *)((uint_32)(blk_c->free.next) - offsetof(block,free)))->free.pre = blk_c->free.pre;
    blk_c->free.pre = NULL;
    blk_c->free.next = NULL;
   }
  }
 return addr;
}


void min_free(void *p )
{
 block *blk = NULL;
 block *blk_c = NULL;
 block *blk_temp = NULL;
 
 if (p > (void *)((uint_32 )memery + save_size) || (p < memery) || (((block *)((uint_32 )memery + save_size))->flag == 0)) {
  printf("unsuccess/n");
 } else {
  blk = (block *)((uint_32)p - sizeof(block));
  blk->flag = 0;  
  blk_c = blk;
  if(( ((block *)((uint_32)(blk->all.next) - offsetof(block,all)))->flag != 0) &&
   (((block *)((uint_32)(blk->all.pre) - offsetof(block,all)))->flag != 0) ) {
   blk->free.pre = &(malloc_header.free);
   blk->free.next = malloc_header.free.next;  
   ((block *)((uint_32)(malloc_header.free.next) - offsetof(block,free)))->free.pre = &(blk->free);
   malloc_header.free.next = &(blk->free);
  }
  else if(( ((block *)((uint_32)(blk->all.next) - offsetof(block,all)))->flag == 0) &&
   (((block *)((uint_32)(blk->all.pre) - offsetof(block,all)))->flag != 0) ) {
          blk = (block *)((uint_32)(blk_c->all.next) - offsetof(block,all));        //  将block 指向下一个节点;   

       /*   表示blk节点消亡;  */
    blk_c->adm_size = blk_c->adm_size + blk->adm_size + sizeof(block);
    blk_c->all.next = blk->all.next;
    ((block *)((uint_32)(blk->all.next)-offsetof(block,all)))->all.pre = &(blk_c->all);    // 将当前block的all_link下一个block的all_pre 指向合并后的block;
    blk->all.pre = NULL;  //
    blk->all.next = NULL;

    /*   将free的block并入下一个节点    */
    blk_c->free.pre =  blk->free.pre;                       
    blk_c->free.next = blk->free.next;
    ((block *)(((uint_32)blk->free.next)-offsetof(block,free)))->free.pre = &(blk_c->free);
    ((block *)((uint_32)(blk->free.pre)-offsetof(block,free)))->free.next = &(blk_c->free);  
   }
         else if(( ((block *)((uint_32)(blk->all.next) - offsetof(block,all)))->flag != 0) &&
    (((block *)((uint_32)(blk->all.pre) - offsetof(block,all)))->flag == 0) ) {
        blk = (block *)((uint_32)(blk_c->all.pre) - offsetof(block,all));         //    将block 指向前一个节点;

                /*   表示blk_c节点消亡;  */
          blk->adm_size = (blk->adm_size + blk_c->adm_size + sizeof(block));
    blk->all.next = blk_c->all.next;         // 将当前block 的all_next 指向blk_c的下一个block节点?    ((block *)((uint_32)(blk_c->all.next) - offsetof(block,all)))->all.pre = &(blk->all);
    ((block *)((uint_32)(blk_c->all.next)-offsetof(block,all)))->all.pre = &(blk->all);
    blk_c->all.next = NULL;
    blk_c->all.pre = NULL;       
   }
              else if((((block *)( (uint_32)(blk->all.next) - offsetof(block,all))) ->flag == 0)&&
    (((block *)((uint_32)(blk->all.pre) - offsetof(block,all)))->flag == 0) ) {      
    blk = (block *)((uint_32)(blk_c->all.pre)-offsetof(block,all));
    blk_temp = (block *)((uint_32)(blk_c->all.next)-offsetof(block,all));
    blk->adm_size = blk->adm_size + blk_c->adm_size + blk_temp->adm_size + sizeof(block) + sizeof(block);

    /*   被合并节点消亡  */   
    blk->all.next = blk_temp->all.next;
    ((block *)((uint_32)(blk_temp->all.next)-offsetof(block,all)))->all.pre = &(blk->all);
    blk_c->all.pre = NULL;
    blk_c->all.next = NULL;
    blk_temp->all.pre = NULL;
    blk_temp->all.next = NULL;

    /*   将被合并的block节点进行删除  */
    ((block *)(((uint_32)blk_temp->free.next)-offsetof(block,free)))->free.pre =
     &(((block *)((uint_32)(blk_temp->free.pre)-offsetof(block,free)))->free); // blk的free的下一个节点的free.pre指向合并的&blk_c->free;
    ((block *)((uint_32)(blk_temp->free.pre)-offsetof(block,free)))->free.next =
     &(((block *)(((uint_32)blk_temp->free.next)-offsetof(block,free)))->free);
   }
   }  
}

原创粉丝点击