void* cmemalloc::palloc_block(size_t size) { u_char* m; size_t psize; mem_data* d, *p, *current; psize = (size_t) (m_d->end - (u_char*) m_d); m = (u_char*)malloc(psize); if (m == NULL) { return NULL; } d = (mem_data*)m; d->end = m + psize; d->next = NULL; d->failed = 0; m += sizeof(mem_data); m = mem_align_ptr(m, MEM_ALIGNMENT); d->last = m + size; current = m_cur; for (p = m_cur; p->next; p = p->next) { if (p->failed++ > 4) { current = p->next; } } p->next = d; m_cur = current ? current : d; return m; }
void *fms_mem_alloc(fms_mem_pool *mem_pool, fms_u32 data_size) { struct rb_node *pos = mem_pool->free_blocks.rb_node; fms_mem_block *block = NULL; struct rb_node *best_fit = NULL; fms_u32 block_data_size = 0; data_size = mem_align_ptr(data_size, 4);//²»¼ÓÕâÒ»¾ä¾Í¶Î´íÎóå why ?½¨Òé×öÒ»´ÎµØÖ·¸ú×Ù²âÊÔ //printf("@@@@@@@@@@fms_mem_alloc:datasize=%u\n", data_size); while (pos) { block = rb_entry(pos, fms_mem_block, rb_node); //printf("lorent 1, need %u[%u]\n", data_size, block->data_size); block_data_size = block->data_size; if (data_size < block->data_size) { best_fit = pos; pos = pos->rb_left; } else if (data_size > block->data_size) { pos = pos->rb_right; } else { best_fit = pos; break; } } if (best_fit == NULL) { //ûÓзûºÏ´óСµÄÄÚ´æ¿é£¬ÄÇôÐèÒªÔÙ´ÎÀ©Õ¹ÄÚ´æ³Ø£¬Ò»°ã²»»á·¢Éú´ËÖÖÇé¿ö printf("mem_pool no space\n"); } if (NULL == pos) { //ûÓÐÕÒµ½¸ÕºÃ·ûºÏµÄÄÚ´æ¿é pos != best_fit block = rb_entry(best_fit, fms_mem_block, rb_node); //printf("lorent 2, find %u\n", block->data_size); block_data_size = block->data_size; //ÕâÀïÓиöÒþ²ØÌõ¼þ block->data_size > data_size if (data_size + sizeof(fms_mem_block) > block->data_size) { /* no room for other buffers */ } else { //printf("lroent 2-1, cut %u->%u\n", block->data_size, data_size); block->data_size = data_size;//²Ã¼ô´óС } } //printf("lorent 3\n"); rb_erase(best_fit, &mem_pool->free_blocks); //printf("lorent 3-1\n"); mem_block_insert_allocated(mem_pool, block); block->free = FMS_FALSE; if (block->data_size != block_data_size) { //²Ã¼ô fms_mem_block *new_block = (fms_mem_block *)((fms_u8 *)block->data + block->data_size); new_block->data_size = block_data_size - block->data_size - sizeof(fms_mem_block); //printf("lorent 4, new block size=%u\n", new_block->data_size ); new_block->id = mem_pool->block_id;//Ìرð×¢Òâ²Ã¼ô³öÀ´µÄBlockµÄIDÊÇÏàͬµÄ new_block->free = FMS_TRUE; list_add(&new_block->entry, &block->entry);//ÕâÀï¿ÉÄÜ»á³ö´í?list_addµÄ¹¦ÄÜ mem_block_insert_free(mem_pool, new_block); } //printf("lorent 5\n"); return (void *)block->data; }
void* cmemalloc::palloc(size_t size) { u_char* m; mem_data* p; if (size <= m_max) { p = m_cur; do { m = mem_align_ptr(p->last, MEM_ALIGNMENT); if ((size_t) (p->end - m) >= size) { p->last = m + size; return m; } p = p->next; }while(p); return palloc_block(size); } return palloc_large(size); }