#include "init.h" #include "hal/memory.h" #include "panic/panic.h" objpath_part_t s_last_region = JOVE_OBJDIR_ENTRIES-1; jove_owned_obj_t init_pop_alloc(void) { jove_owned_obj_t *freemem_dir = objdir_trygetlocal(_rootdir_obj, ROOTDIR_FREEMEMORY_I); if(freemem_dir == 0) { kpanic("Untyped directory is locked!\n"); } int cycles = 0; while(cycles++ < 512) { if(objdir_peeklocal(freemem_dir, s_last_region).type != JOVE_OBJ_REGION) { s_last_region--; continue; } jove_owned_obj_t frame = { 0 }; jove_owned_obj_t *region = objdir_getlocal(freemem_dir, s_last_region); if(region_alloc(region, &frame) < 0) { obj_release(region); continue; } obj_release(region); obj_release(freemem_dir); return frame; } kpanic("%s: Kernel is out of memory!\n", __func__); }