コード例 #1
0
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;
}
コード例 #2
0
ファイル: fms_mem_tree.c プロジェクト: fremaks/fremaks_utils
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;
}
コード例 #3
0
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);

}