#include "init.h" #include "sys/objdir.h" #include "hal/memory.h" #include "panic/panic.h" objpath_part_t s_last_region = OBJDIR_ENTRIES-1; jove_owned_obj_t init_pop_alloc(void) { jove_obj_t *freemem_dir = obj_release(objdir_getlocal(_rootdir_obj, INIT_ROOTDIR_FREEMEMORY_I)); 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); return frame; } kpanic("%s: Kernel is out of memory!\n", __func__); }