__alloc
user_0531932
c_cpp
2 years ago
1.3 kB
8
Indexable
/*__alloc - allocate a memory region
*@caller: caller
*@vmaid: ID vm area to alloc memory region
*@rgid: memory region ID (used to identify variable in symbole table)
*@size: allocated size
*@alloc_addr: address of allocated memory region
*/
int __alloc(struct pcb_t *caller, int vmaid, int rgid, int size, int *alloc_addr)
{
/* Allocate at the toproof */
struct vm_rg_struct rgnode;
if (get_free_vmrg_area(caller, vmaid, size, &rgnode) == 0)
{
caller->mm->symrgtbl[rgid].rg_start = rgnode.rg_start;
caller->mm->symrgtbl[rgid].rg_end = rgnode.rg_end;
*alloc_addr = rgnode.rg_start;
return 0;
}
/*Attempt to increase limit to get space */
struct vm_area_struct *cur_vma = get_vma_by_num(caller->mm, vmaid);\
int gap_size = cur_vma->vm_end - cur_vma->sbrk;
if(gap_size >= size){
cur_vma->sbrk += size;
return 0;
}
int inc_sz = PAGING_PAGE_ALIGNSZ(size - gap_size);
if (inc_vma_limit(caller, vmaid, inc_sz) < 0) return -1;
int old_sbrk;
old_sbrk = cur_vma->sbrk;
/*Successful increase limit */
caller->mm->symrgtbl[rgid].rg_start = old_sbrk;
caller->mm->symrgtbl[rgid].rg_end = old_sbrk + size - gap_size;
cur_vma->sbrk = old_sbrk + size - gap_size;
*alloc_addr = old_sbrk;
return 0;
}Editor is loading...