public phys_clicks alloc_mem (phys_clicks clicks) {
register struct hole *hp, *prev_ptr;
phys_clicks old_base;
hp = hole_head;
while ( hp != nil_hole ) {
if (hp->h_len >= clicks) {
old_base = hp->h_base;
hp->h_len -= clicks;
hp->h_base += clicks;
if (hp->h_len != 0) return old_base;
del_slot (prev_ptr, hp);
return old_base;
}
prev_ptr = hp;
hp = hp->h_next;
}
return (E_NO_MEM);
}
mm/alloc.c
alloc_mem()
free_mem()
del_slot()
merge()
max_hole()
mem_init()
PUBLIC del_slot (register struct hole *hp, register struct hole *prev_ptr) {
if (hp == hole_head)
hole_head = hp -> h_next;
else
prev_ptr -> h_next = hp->h_next;
hp->h_next = free_slots;
free_slots = hp;
}