Пример #1
0
unsigned int alloc_buddy(int size, buddy_t* tmp_buddy)
{
    buddy_t* cur_buddy;    
    int new_size;
    cur_buddy = tmp_buddy;
    if(size>1){
        new_size = cur_buddy->size/2;
        if(tmp_buddy->left==NULL && tmp_buddy->right==NULL){
            new_size = tmp_buddy->size/2;
            printf("Ok\n");             
            tmp_buddy->left = create_buddy(new_size);
            if(new_size/2>=size) alloc_buddy(size,cur_buddy->left);
            else tmp_buddy->status == BUDDY_BUSY;
        }
        else if(tmp_buddy->left!=NULL && tmp_buddy->status==BUDDY_FREE){            
            alloc_buddy(size, tmp_buddy->left);
        } else if(tmp_buddy->right!=NULL && tmp_buddy->status==BUDDY_FREE){
            alloc_buddy(size, tmp_buddy->right);
        }
        else{
            printf("Se sono nell'else allora devo proseguire nella navigazione\n");            
            alloc_buddy(size/2,tmp_buddy);
        }      
    }
//     else printf("Otherwise ok\n");
}
Пример #2
0
struct page* __pages_alloc (zone_t *zone ,gfp_t flage,uint32_t order)
{
	page_t * pf = NULL;

	if ((flage & _GFP_ZERO) && (flage & _GFP_HIGH))
		panic("(flage & _GFP_ZERO) && (flage & _GFP_HIGH)\n");

	pf =  alloc_buddy (zone,order);

	if(pf == NULL)
		goto out;

	if (flage & _GFP_ZERO) {
		int i = PAGE_SIZE << order;
		memset((void*)page2virt(pf),0,i);
	}

out:
	return pf;
}