示例#1
0
文件: pool.c 项目: magiccao/bigpig
void *get_memory(struct pool_node *pool, int size)
{
    void *ptr;
    struct pool_node *p;
    int free_size;

    if (size > pool->size) {
        NOTICE("request memory is larger than pool size\n");
        return NULL;
    }

    p = pool;
    while (1) {
        free_size = p->end - p->last;
        if (free_size >= size) {
            ptr = p->last;
            p->last += size;
            return ptr;
        }
        if (NULL == p->next)
            break;

        p = p->next;
    }
    ptr = get_more_memory(p, size);
    return ptr;
}
示例#2
0
local ptr alloc_piece(int size,wn_memgp group)
{
  int old_size;
  ptr ret;

  old_size = size;
  if(wn_gp_pad_flag)
  {
    size += sizeof(union pad_type_8aligned_union);
  }
  if(size >= group->block_mem_left)
  {
    get_more_memory(size,group);
  }
  if (size & 0x7) /* 4-aligned -- get from end */
  {
    group->block_end_ptr = (ptr) ((char *)group->block_end_ptr - size);
    ret = group->block_end_ptr;
  }
  else /* 8-aligned -- get from start */
  {
    ret = group->block_ptr;
    group->block_ptr = (ptr) ((char *)group->block_ptr + size);
  }
  group->block_mem_left -= size;
  group->mem_used += old_size;
  if(wn_gp_pad_flag)
  {
    fill_pad((pad_type)((char *)ret + old_size), group);
  }
  if(wn_gp_trap_address_flag)
  {
    if(ret == wn_gp_trap_address_address)
    {
      fprintf(stderr,"address found.\n");
      wn_assert_notreached();
    }
  }

  wn_assert(!(((long unsigned)  ret) & 3));
  wn_assert( (((long unsigned) size) & 7) || !(((long unsigned) ret) & 7));

  return(ret);
} /* alloc_piece */