示例#1
0
Ret buddy_free(Buddy* thiz, size_t offset)
{
	return_val_if_fail(thiz!=NULL && (offset%2)==0, RET_FAIL);
	
	int i;
	for(i=0; i<thiz->size; i++)
	{
		Node* iter = foreach_list(thiz->alloc_list[i], (void* )offset, match_block_callback);
		if(iter == NULL) continue;

		delete_from_list(&(thiz->alloc_list[i]), iter);
		free(iter); iter = NULL;

		Node* buddy_iter = foreach_list(thiz->free_list[i], (void* )offset, match_block_callback);
		if(buddy_iter == NULL)
		{
			return RET_OK;
		}

		delete_from_list(&(thiz->free_list[i]), buddy_iter);
		buddy_iter->size = buddy_iter->size + 1;
		insert_head(&(thiz->free_list[buddy_iter->size - 1]), buddy_iter);
		//TODO merge should be recurive.
	}
	
	return RET_FAIL;
}
示例#2
0
Ret buddy_destroy(Buddy* thiz)
{
	return_val_if_fail(thiz!=NULL, RET_FAIL);

	size_t i;
	for(i=0; i<size; i++)
	{
		foreach_list(thiz->free_list[i], NULL, destroy_list_callback);
		foreach_list(thiz->alloc_list[i], NULL, destroy_list_callback);
	}
	
	free(thiz);

	return RET_OK;
}
示例#3
0
static unsigned list_size(exec_list* list)
{
	unsigned i = 0;
	foreach_list(node, list)
	i++;
	
	return i;
}
示例#4
0
void		dump_list(t_list * list, void (*displayer)(void *))
{
  foreach_list(list, displayer);
}