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; }
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; }
static unsigned list_size(exec_list* list) { unsigned i = 0; foreach_list(node, list) i++; return i; }
void dump_list(t_list * list, void (*displayer)(void *)) { foreach_list(list, displayer); }