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; }
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 */